Ly89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8gRGVzY3JpcHRpb246Ci8vCi8vIFRoaXMgZmlsZSBpcyBmb3IgODgxMmExYW50IENvLWV4aXN0IG1lY2hhbmlzbQovLwovLyBIaXN0b3J5Ci8vIDIwMTIvMTEvMTUgQ29zYSBmaXJzdCBjaGVjayBpbi4KLy8KLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci8vIGluY2x1ZGUgZmlsZXMKLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KI2luY2x1ZGUgImhhbGJ0X3ByZWNvbXAuaCIKI2lmIDEKLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8gR2xvYmFsIHZhcmlhYmxlcywgdGhlc2UgYXJlIHN0YXRpYyB2YXJpYWJsZXMKLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0Kc3RhdGljIENPRVhfRE1fODgxMkFfMUFOVAkJR0xDb2V4RG04ODEyYTFBbnQ7CnN0YXRpYyBQQ09FWF9ETV84ODEyQV8xQU5UIAljb2V4X2RtPSZHTENvZXhEbTg4MTJhMUFudDsKc3RhdGljIENPRVhfU1RBXzg4MTJBXzFBTlQJCUdMQ29leFN0YTg4MTJhMUFudDsKc3RhdGljIFBDT0VYX1NUQV84ODEyQV8xQU5UCWNvZXhfc3RhPSZHTENvZXhTdGE4ODEyYTFBbnQ7Cgpjb25zdCBjaGFyICpjb25zdCBHTEJ0SW5mb1NyYzg4MTJhMUFudFtdPXsKCSJCVCBJbmZvW3dpZmkgZnddIiwKCSJCVCBJbmZvW2J0IHJzcF0iLAoJIkJUIEluZm9bYnQgYXV0byByZXBvcnRdIiwKfTsKCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci8vIGxvY2FsIGZ1bmN0aW9uIHByb3RvIHR5cGUgaWYgbmVlZGVkCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci8vIGxvY2FsIGZ1bmN0aW9uIHN0YXJ0IHdpdGggaGFsYnRjODgxMmExYW50XwovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojaWYgMAp2b2lkCmhhbGJ0Yzg4MTJhMWFudF9SZWcweDU1MEJpdDMoCgkgCVBCVENfQ09FWElTVAkJYnRjb2V4aXN0LAoJIAlCT09MRUFOCQkJYlNldAoJKQp7Cgl1MUJ5dGUJdTF0bXA9MDsKCQoJdTF0bXAgPSBidGNvZXhpc3QtPmJ0Y19yZWFkXzFieXRlKGJ0Y29leGlzdCwgMHg1NTApOwoJaWYoYlNldCkKCXsKCQl1MXRtcCB8PSBCSVQzOwoJfQoJZWxzZQoJewoJCXUxdG1wICY9IH5CSVQzOwoJfQoJYnRjb2V4aXN0LT5idGNfd3JpdGVfMWJ5dGUoYnRjb2V4aXN0LCAweDU1MCwgdTF0bXApOwoJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBzZXQgMHg1NTBbM109JWRcbiIsIChiU2V0PyAxOjApKSk7Cn0KI2VuZGlmCnUxQnl0ZQpoYWxidGM4ODEyYTFhbnRfQnRSc3NpU3RhdGUoCgl1MUJ5dGUJCQlsZXZlbF9udW0sCgl1MUJ5dGUJCQlyc3NpX3RocmVzaCwKCXUxQnl0ZQkJCXJzc2lfdGhyZXNoMQoJKQp7CglzNEJ5dGUJCQlidF9yc3NpPTA7Cgl1MUJ5dGUJCQlidF9yc3NpX3N0YXRlOwoKCWJ0X3Jzc2kgPSBjb2V4X3N0YS0+YnRfcnNzaTsKCglpZihsZXZlbF9udW0gPT0gMikKCXsJCQkKCQlpZiggKGNvZXhfc3RhLT5wcmVfYnRfcnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9MT1cpIHx8CgkJCShjb2V4X3N0YS0+cHJlX2J0X3Jzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9MT1cpKQoJCXsKCQkJaWYoYnRfcnNzaSA+PSAocnNzaV90aHJlc2grQlRDX1JTU0lfQ09FWF9USFJFU0hfVE9MXzg4MTJBXzFBTlQpKQoJCQl7CgkJCQlidF9yc3NpX3N0YXRlID0gQlRDX1JTU0lfU1RBVEVfSElHSDsKCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19CVF9SU1NJX1NUQVRFLCAoIltCVENvZXhdLCBCVCBSc3NpIHN0YXRlIHN3aXRjaCB0byBIaWdoXG4iKSk7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlidF9yc3NpX3N0YXRlID0gQlRDX1JTU0lfU1RBVEVfU1RBWV9MT1c7CgkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fQlRfUlNTSV9TVEFURSwgKCJbQlRDb2V4XSwgQlQgUnNzaSBzdGF0ZSBzdGF5IGF0IExvd1xuIikpOwoJCQl9CgkJfQoJCWVsc2UKCQl7CgkJCWlmKGJ0X3Jzc2kgPCByc3NpX3RocmVzaCkKCQkJewoJCQkJYnRfcnNzaV9zdGF0ZSA9IEJUQ19SU1NJX1NUQVRFX0xPVzsKCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19CVF9SU1NJX1NUQVRFLCAoIltCVENvZXhdLCBCVCBSc3NpIHN0YXRlIHN3aXRjaCB0byBMb3dcbiIpKTsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCWJ0X3Jzc2lfc3RhdGUgPSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0g7CgkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fQlRfUlNTSV9TVEFURSwgKCJbQlRDb2V4XSwgQlQgUnNzaSBzdGF0ZSBzdGF5IGF0IEhpZ2hcbiIpKTsKCQkJfQoJCX0KCX0KCWVsc2UgaWYobGV2ZWxfbnVtID09IDMpCgl7CgkJaWYocnNzaV90aHJlc2ggPiByc3NpX3RocmVzaDEpCgkJewoJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fQlRfUlNTSV9TVEFURSwgKCJbQlRDb2V4XSwgQlQgUnNzaSB0aHJlc2ggZXJyb3IhIVxuIikpOwoJCQlyZXR1cm4gY29leF9zdGEtPnByZV9idF9yc3NpX3N0YXRlOwoJCX0KCQkKCQlpZiggKGNvZXhfc3RhLT5wcmVfYnRfcnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9MT1cpIHx8CgkJCShjb2V4X3N0YS0+cHJlX2J0X3Jzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9MT1cpKQoJCXsKCQkJaWYoYnRfcnNzaSA+PSAocnNzaV90aHJlc2grQlRDX1JTU0lfQ09FWF9USFJFU0hfVE9MXzg4MTJBXzFBTlQpKQoJCQl7CgkJCQlidF9yc3NpX3N0YXRlID0gQlRDX1JTU0lfU1RBVEVfTUVESVVNOwoJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX0JUX1JTU0lfU1RBVEUsICgiW0JUQ29leF0sIEJUIFJzc2kgc3RhdGUgc3dpdGNoIHRvIE1lZGl1bVxuIikpOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJYnRfcnNzaV9zdGF0ZSA9IEJUQ19SU1NJX1NUQVRFX1NUQVlfTE9XOwoJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX0JUX1JTU0lfU1RBVEUsICgiW0JUQ29leF0sIEJUIFJzc2kgc3RhdGUgc3RheSBhdCBMb3dcbiIpKTsKCQkJfQoJCX0KCQllbHNlIGlmKCAoY29leF9zdGEtPnByZV9idF9yc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX01FRElVTSkgfHwKCQkJKGNvZXhfc3RhLT5wcmVfYnRfcnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX01FRElVTSkpCgkJewoJCQlpZihidF9yc3NpID49IChyc3NpX3RocmVzaDErQlRDX1JTU0lfQ09FWF9USFJFU0hfVE9MXzg4MTJBXzFBTlQpKQoJCQl7CgkJCQlidF9yc3NpX3N0YXRlID0gQlRDX1JTU0lfU1RBVEVfSElHSDsKCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19CVF9SU1NJX1NUQVRFLCAoIltCVENvZXhdLCBCVCBSc3NpIHN0YXRlIHN3aXRjaCB0byBIaWdoXG4iKSk7CgkJCX0KCQkJZWxzZSBpZihidF9yc3NpIDwgcnNzaV90aHJlc2gpCgkJCXsKCQkJCWJ0X3Jzc2lfc3RhdGUgPSBCVENfUlNTSV9TVEFURV9MT1c7CgkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fQlRfUlNTSV9TVEFURSwgKCJbQlRDb2V4XSwgQlQgUnNzaSBzdGF0ZSBzd2l0Y2ggdG8gTG93XG4iKSk7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlidF9yc3NpX3N0YXRlID0gQlRDX1JTU0lfU1RBVEVfU1RBWV9NRURJVU07CgkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fQlRfUlNTSV9TVEFURSwgKCJbQlRDb2V4XSwgQlQgUnNzaSBzdGF0ZSBzdGF5IGF0IE1lZGl1bVxuIikpOwoJCQl9CgkJfQoJCWVsc2UKCQl7CgkJCWlmKGJ0X3Jzc2kgPCByc3NpX3RocmVzaDEpCgkJCXsKCQkJCWJ0X3Jzc2lfc3RhdGUgPSBCVENfUlNTSV9TVEFURV9NRURJVU07CgkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fQlRfUlNTSV9TVEFURSwgKCJbQlRDb2V4XSwgQlQgUnNzaSBzdGF0ZSBzd2l0Y2ggdG8gTWVkaXVtXG4iKSk7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlidF9yc3NpX3N0YXRlID0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIOwoJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX0JUX1JTU0lfU1RBVEUsICgiW0JUQ29leF0sIEJUIFJzc2kgc3RhdGUgc3RheSBhdCBIaWdoXG4iKSk7CgkJCX0KCQl9Cgl9CgkJCgljb2V4X3N0YS0+cHJlX2J0X3Jzc2lfc3RhdGUgPSBidF9yc3NpX3N0YXRlOwoKCXJldHVybiBidF9yc3NpX3N0YXRlOwp9Cgp1MUJ5dGUKaGFsYnRjODgxMmExYW50X1dpZmlSc3NpU3RhdGUoCgkgCVBCVENfQ09FWElTVAkJYnRjb2V4aXN0LAoJIAl1MUJ5dGUJCQlpbmRleCwKCSAJdTFCeXRlCQkJbGV2ZWxfbnVtLAoJIAl1MUJ5dGUJCQlyc3NpX3RocmVzaCwKCSAJdTFCeXRlCQkJcnNzaV90aHJlc2gxCgkpCnsKCXM0Qnl0ZQkJCXdpZmlfcnNzaT0wOwoJdTFCeXRlCQkJd2lmaV9yc3NpX3N0YXRlOwoKCWJ0Y29leGlzdC0+YnRjX2dldChidGNvZXhpc3QsIEJUQ19HRVRfUzRfV0lGSV9SU1NJLCAmd2lmaV9yc3NpKTsKCQoJaWYobGV2ZWxfbnVtID09IDIpCgl7CgkJaWYoIChjb2V4X3N0YS0+cHJlX3dpZmlfcnNzaV9zdGF0ZVtpbmRleF0gPT0gQlRDX1JTU0lfU1RBVEVfTE9XKSB8fAoJCQkoY29leF9zdGEtPnByZV93aWZpX3Jzc2lfc3RhdGVbaW5kZXhdID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfTE9XKSkKCQl7CgkJCWlmKHdpZmlfcnNzaSA+PSAocnNzaV90aHJlc2grQlRDX1JTU0lfQ09FWF9USFJFU0hfVE9MXzg4MTJBXzFBTlQpKQoJCQl7CgkJCQl3aWZpX3Jzc2lfc3RhdGUgPSBCVENfUlNTSV9TVEFURV9ISUdIOwoJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1dJRklfUlNTSV9TVEFURSwgKCJbQlRDb2V4XSwgd2lmaSBSU1NJIHN0YXRlIHN3aXRjaCB0byBIaWdoXG4iKSk7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQl3aWZpX3Jzc2lfc3RhdGUgPSBCVENfUlNTSV9TVEFURV9TVEFZX0xPVzsKCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19XSUZJX1JTU0lfU1RBVEUsICgiW0JUQ29leF0sIHdpZmkgUlNTSSBzdGF0ZSBzdGF5IGF0IExvd1xuIikpOwoJCQl9CgkJfQoJCWVsc2UKCQl7CgkJCWlmKHdpZmlfcnNzaSA8IHJzc2lfdGhyZXNoKQoJCQl7CgkJCQl3aWZpX3Jzc2lfc3RhdGUgPSBCVENfUlNTSV9TVEFURV9MT1c7CgkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fV0lGSV9SU1NJX1NUQVRFLCAoIltCVENvZXhdLCB3aWZpIFJTU0kgc3RhdGUgc3dpdGNoIHRvIExvd1xuIikpOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJd2lmaV9yc3NpX3N0YXRlID0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIOwoJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1dJRklfUlNTSV9TVEFURSwgKCJbQlRDb2V4XSwgd2lmaSBSU1NJIHN0YXRlIHN0YXkgYXQgSGlnaFxuIikpOwoJCQl9CgkJfQoJfQoJZWxzZSBpZihsZXZlbF9udW0gPT0gMykKCXsKCQlpZihyc3NpX3RocmVzaCA+IHJzc2lfdGhyZXNoMSkKCQl7CgkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19XSUZJX1JTU0lfU1RBVEUsICgiW0JUQ29leF0sIHdpZmkgUlNTSSB0aHJlc2ggZXJyb3IhIVxuIikpOwoJCQlyZXR1cm4gY29leF9zdGEtPnByZV93aWZpX3Jzc2lfc3RhdGVbaW5kZXhdOwoJCX0KCQkKCQlpZiggKGNvZXhfc3RhLT5wcmVfd2lmaV9yc3NpX3N0YXRlW2luZGV4XSA9PSBCVENfUlNTSV9TVEFURV9MT1cpIHx8CgkJCShjb2V4X3N0YS0+cHJlX3dpZmlfcnNzaV9zdGF0ZVtpbmRleF0gPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9MT1cpKQoJCXsKCQkJaWYod2lmaV9yc3NpID49IChyc3NpX3RocmVzaCtCVENfUlNTSV9DT0VYX1RIUkVTSF9UT0xfODgxMkFfMUFOVCkpCgkJCXsKCQkJCXdpZmlfcnNzaV9zdGF0ZSA9IEJUQ19SU1NJX1NUQVRFX01FRElVTTsKCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19XSUZJX1JTU0lfU1RBVEUsICgiW0JUQ29leF0sIHdpZmkgUlNTSSBzdGF0ZSBzd2l0Y2ggdG8gTWVkaXVtXG4iKSk7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQl3aWZpX3Jzc2lfc3RhdGUgPSBCVENfUlNTSV9TVEFURV9TVEFZX0xPVzsKCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19XSUZJX1JTU0lfU1RBVEUsICgiW0JUQ29leF0sIHdpZmkgUlNTSSBzdGF0ZSBzdGF5IGF0IExvd1xuIikpOwoJCQl9CgkJfQoJCWVsc2UgaWYoIChjb2V4X3N0YS0+cHJlX3dpZmlfcnNzaV9zdGF0ZVtpbmRleF0gPT0gQlRDX1JTU0lfU1RBVEVfTUVESVVNKSB8fAoJCQkoY29leF9zdGEtPnByZV93aWZpX3Jzc2lfc3RhdGVbaW5kZXhdID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfTUVESVVNKSkKCQl7CgkJCWlmKHdpZmlfcnNzaSA+PSAocnNzaV90aHJlc2gxK0JUQ19SU1NJX0NPRVhfVEhSRVNIX1RPTF84ODEyQV8xQU5UKSkKCQkJewoJCQkJd2lmaV9yc3NpX3N0YXRlID0gQlRDX1JTU0lfU1RBVEVfSElHSDsKCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19XSUZJX1JTU0lfU1RBVEUsICgiW0JUQ29leF0sIHdpZmkgUlNTSSBzdGF0ZSBzd2l0Y2ggdG8gSGlnaFxuIikpOwoJCQl9CgkJCWVsc2UgaWYod2lmaV9yc3NpIDwgcnNzaV90aHJlc2gpCgkJCXsKCQkJCXdpZmlfcnNzaV9zdGF0ZSA9IEJUQ19SU1NJX1NUQVRFX0xPVzsKCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19XSUZJX1JTU0lfU1RBVEUsICgiW0JUQ29leF0sIHdpZmkgUlNTSSBzdGF0ZSBzd2l0Y2ggdG8gTG93XG4iKSk7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQl3aWZpX3Jzc2lfc3RhdGUgPSBCVENfUlNTSV9TVEFURV9TVEFZX01FRElVTTsKCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19XSUZJX1JTU0lfU1RBVEUsICgiW0JUQ29leF0sIHdpZmkgUlNTSSBzdGF0ZSBzdGF5IGF0IE1lZGl1bVxuIikpOwoJCQl9CgkJfQoJCWVsc2UKCQl7CgkJCWlmKHdpZmlfcnNzaSA8IHJzc2lfdGhyZXNoMSkKCQkJewoJCQkJd2lmaV9yc3NpX3N0YXRlID0gQlRDX1JTU0lfU1RBVEVfTUVESVVNOwoJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1dJRklfUlNTSV9TVEFURSwgKCJbQlRDb2V4XSwgd2lmaSBSU1NJIHN0YXRlIHN3aXRjaCB0byBNZWRpdW1cbiIpKTsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCXdpZmlfcnNzaV9zdGF0ZSA9IEJUQ19SU1NJX1NUQVRFX1NUQVlfSElHSDsKCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19XSUZJX1JTU0lfU1RBVEUsICgiW0JUQ29leF0sIHdpZmkgUlNTSSBzdGF0ZSBzdGF5IGF0IEhpZ2hcbiIpKTsKCQkJfQoJCX0KCX0KCQkKCWNvZXhfc3RhLT5wcmVfd2lmaV9yc3NpX3N0YXRlW2luZGV4XSA9IHdpZmlfcnNzaV9zdGF0ZTsKCglyZXR1cm4gd2lmaV9yc3NpX3N0YXRlOwp9Cgp2b2lkCmhhbGJ0Yzg4MTJhMWFudF9Nb25pdG9yQnRFbmFibGVEaXNhYmxlKAoJICAJUEJUQ19DT0VYSVNUCQlidGNvZXhpc3QKCSkKewoJc3RhdGljIEJPT0xFQU4JcHJlX2J0X2Rpc2FibGVkPWZhbHNlOwoJc3RhdGljIHU0Qnl0ZQkJYnRfZGlzYWJsZV9jbnQ9MDsKCUJPT0xFQU4JCQlidF9hY3RpdmU9dHJ1ZSwgYnRfZGlzYWJsZV9ieTY4PWZhbHNlLCBidF9kaXNhYmxlZD1mYWxzZTsKCXU0Qnl0ZQkJCXU0X3RtcD0wOwoKCS8vIFRoaXMgZnVuY3Rpb24gY2hlY2sgaWYgYnQgaXMgZGlzYWJsZWQKCglpZigJY29leF9zdGEtPmhpZ2hfcHJpb3JpdHlfdHggPT0gMCAmJgoJCWNvZXhfc3RhLT5oaWdoX3ByaW9yaXR5X3J4ID09IDAgJiYKCQljb2V4X3N0YS0+bG93X3ByaW9yaXR5X3R4ID09IDAgJiYKCQljb2V4X3N0YS0+bG93X3ByaW9yaXR5X3J4ID09IDApCgl7CgkJYnRfYWN0aXZlID0gZmFsc2U7Cgl9CglpZigJY29leF9zdGEtPmhpZ2hfcHJpb3JpdHlfdHggPT0gMHhmZmZmICYmCgkJY29leF9zdGEtPmhpZ2hfcHJpb3JpdHlfcnggPT0gMHhmZmZmICYmCgkJY29leF9zdGEtPmxvd19wcmlvcml0eV90eCA9PSAweGZmZmYgJiYKCQljb2V4X3N0YS0+bG93X3ByaW9yaXR5X3J4ID09IDB4ZmZmZikKCXsKCQlidF9hY3RpdmUgPSBmYWxzZTsKCX0KCWlmKGJ0X2FjdGl2ZSkKCXsKCQlidF9kaXNhYmxlX2NudCA9IDA7CgkJYnRfZGlzYWJsZWQgPSBmYWxzZTsKCQlidGNvZXhpc3QtPmJ0Y19zZXQoYnRjb2V4aXN0LCBCVENfU0VUX0JMX0JUX0RJU0FCTEUsICZidF9kaXNhYmxlZCk7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX0JUX01PTklUT1IsICgiW0JUQ29leF0sIEJUIGlzIGVuYWJsZWQgISFcbiIpKTsKCX0KCWVsc2UKCXsKCQlidF9kaXNhYmxlX2NudCsrOwoJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19CVF9NT05JVE9SLCAoIltCVENvZXhdLCBidCBhbGwgY291bnRlcnM9MCwgJWQgdGltZXMhIVxuIiwgCgkJCQlidF9kaXNhYmxlX2NudCkpOwoJCWlmKGJ0X2Rpc2FibGVfY250ID49IDIgfHxidF9kaXNhYmxlX2J5NjgpCgkJewoJCQlidF9kaXNhYmxlZCA9IHRydWU7CgkJCWJ0Y29leGlzdC0+YnRjX3NldChidGNvZXhpc3QsIEJUQ19TRVRfQkxfQlRfRElTQUJMRSwgJmJ0X2Rpc2FibGVkKTsKCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX0JUX01PTklUT1IsICgiW0JUQ29leF0sIEJUIGlzIGRpc2FibGVkICEhXG4iKSk7CgkJfQoJfQoJaWYocHJlX2J0X2Rpc2FibGVkICE9IGJ0X2Rpc2FibGVkKQoJewoJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19CVF9NT05JVE9SLCAoIltCVENvZXhdLCBCVCBpcyBmcm9tICVzIHRvICVzISFcbiIsIAoJCQkocHJlX2J0X2Rpc2FibGVkID8gImRpc2FibGVkIjoiZW5hYmxlZCIpLCAKCQkJKGJ0X2Rpc2FibGVkID8gImRpc2FibGVkIjoiZW5hYmxlZCIpKSk7CgkJcHJlX2J0X2Rpc2FibGVkID0gYnRfZGlzYWJsZWQ7CgkJaWYoIWJ0X2Rpc2FibGVkKQoJCXsKCQl9CgkJZWxzZQoJCXsKCQl9Cgl9Cn0KCnZvaWQKaGFsYnRjODgxMmExYW50X01vbml0b3JCdEN0cigKCSAJUEJUQ19DT0VYSVNUCQlidGNvZXhpc3QKCSkKewoJdTRCeXRlIAkJCXJlZ19ocF90eF9yeCwgcmVnX2xwX3R4X3J4LCB1NF90bXA7Cgl1NEJ5dGUJCQlyZWdfaHBfdHg9MCwgcmVnX2hwX3J4PTAsIHJlZ19scF90eD0wLCByZWdfbHBfcng9MDsKCXUxQnl0ZQkJCXUxX3RtcDsKCQoJcmVnX2hwX3R4X3J4ID0gMHg3NzA7CglyZWdfbHBfdHhfcnggPSAweDc3NDsKCgl1NF90bXAgPSBidGNvZXhpc3QtPmJ0Y19yZWFkXzRieXRlKGJ0Y29leGlzdCwgcmVnX2hwX3R4X3J4KTsKCXJlZ19ocF90eCA9IHU0X3RtcCAmIGJNYXNrTFdvcmQ7CglyZWdfaHBfcnggPSAodTRfdG1wICYgYk1hc2tIV29yZCk+PjE2OwoKCXU0X3RtcCA9IGJ0Y29leGlzdC0+YnRjX3JlYWRfNGJ5dGUoYnRjb2V4aXN0LCByZWdfbHBfdHhfcngpOwoJcmVnX2xwX3R4ID0gdTRfdG1wICYgYk1hc2tMV29yZDsKCXJlZ19scF9yeCA9ICh1NF90bXAgJiBiTWFza0hXb3JkKT4+MTY7CgkJCgljb2V4X3N0YS0+aGlnaF9wcmlvcml0eV90eCA9IHJlZ19ocF90eDsKCWNvZXhfc3RhLT5oaWdoX3ByaW9yaXR5X3J4ID0gcmVnX2hwX3J4OwoJY29leF9zdGEtPmxvd19wcmlvcml0eV90eCA9IHJlZ19scF90eDsKCWNvZXhfc3RhLT5sb3dfcHJpb3JpdHlfcnggPSByZWdfbHBfcng7CgoJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX0JUX01PTklUT1IsICgiW0JUQ29leF0sIEhpZ2ggUHJpb3JpdHkgVHgvUnggKHJlZyAweCV4KT0leCglZCkvJXgoJWQpXG4iLCAKCQlyZWdfaHBfdHhfcngsIHJlZ19ocF90eCwgcmVnX2hwX3R4LCByZWdfaHBfcngsIHJlZ19ocF9yeCkpOwoJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX0JUX01PTklUT1IsICgiW0JUQ29leF0sIExvdyBQcmlvcml0eSBUeC9SeCAocmVnIDB4JXgpPSV4KCVkKS8leCglZClcbiIsIAoJCXJlZ19scF90eF9yeCwgcmVnX2xwX3R4LCByZWdfbHBfdHgsIHJlZ19scF9yeCwgcmVnX2xwX3J4KSk7CgoJLy8gcmVzZXQgY291bnRlcgoJYnRjb2V4aXN0LT5idGNfd3JpdGVfMWJ5dGUoYnRjb2V4aXN0LCAweDc2ZSwgMHhjKTsKfQoKdm9pZApoYWxidGM4ODEyYTFhbnRfUXVlcnlCdEluZm8oCgkgCVBCVENfQ09FWElTVAkJYnRjb2V4aXN0CgkpCnsJCgl1MUJ5dGUJZGF0YUxlbj0zOwoJdTFCeXRlCWJ1Zls1XSA9IHswfTsKCXN0YXRpYwl1NEJ5dGUJYnRJbmZvQ250PTA7CgoJaWYoIWJ0SW5mb0NudCB8fAoJCShjb2V4X3N0YS0+YnRfaW5mb19jMmhfY250W0JUX0lORk9fU1JDXzg4MTJBXzFBTlRfQlRfUlNQXS1idEluZm9DbnQpPjIpCgl7CgkJYnVmWzBdID0gZGF0YUxlbjsKCQlidWZbMV0gPSAweDE7CS8vIHBvbGxpbmcgZW5hYmxlLCAxPWVuYWJsZSwgMD1kaXNhYmxlCgkJYnVmWzJdID0gMHgyOwkvLyBwb2xsaW5nIHRpbWUgaW4gc2Vjb25kcwoJCWJ1ZlszXSA9IDB4MTsJLy8gYXV0byByZXBvcnQgZW5hYmxlLCAxPWVuYWJsZSwgMD1kaXNhYmxlCgkJCQoJCWJ0Y29leGlzdC0+YnRjX3NldChidGNvZXhpc3QsIEJUQ19TRVRfQUNUX0NUUkxfQlRfSU5GTywgKFBWT0lEKSZidWZbMF0pOwoJfQoJYnRJbmZvQ250ID0gY29leF9zdGEtPmJ0X2luZm9fYzJoX2NudFtCVF9JTkZPX1NSQ184ODEyQV8xQU5UX0JUX1JTUF07Cn0KdTFCeXRlCmhhbGJ0Yzg4MTJhMWFudF9BY3Rpb25BbGdvcml0aG0oCgkgCVBCVENfQ09FWElTVAkJYnRjb2V4aXN0CgkpCnsKCVBCVENfU1RBQ0tfSU5GTwkJc3RhY2tfaW5mbz0mYnRjb2V4aXN0LT5zdGFja19pbmZvOwoJQk9PTEVBTgkJCQlidF9oc19vbj1mYWxzZTsKCXUxQnl0ZQkJCQlhbGdvcml0aG09QlRfODgxMkFfMUFOVF9DT0VYX0FMR09fVU5ERUZJTkVEOwoJdTFCeXRlCQkJCW51bV9vZl9kaWZmX3Byb2ZpbGU9MDsKCglidGNvZXhpc3QtPmJ0Y19nZXQoYnRjb2V4aXN0LCBCVENfR0VUX0JMX0hTX09QRVJBVElPTiwgJmJ0X2hzX29uKTsKCQoJaWYoIXN0YWNrX2luZm8tPmJ0X2xpbmtfZXhpc3QpCgl7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBObyBwcm9maWxlIGV4aXN0cyEhIVxuIikpOwoJCXJldHVybiBhbGdvcml0aG07Cgl9CgoJaWYoc3RhY2tfaW5mby0+c2NvX2V4aXN0KQoJCW51bV9vZl9kaWZmX3Byb2ZpbGUrKzsKCWlmKHN0YWNrX2luZm8tPmhpZF9leGlzdCkKCQludW1fb2ZfZGlmZl9wcm9maWxlKys7CglpZihzdGFja19pbmZvLT5wYW5fZXhpc3QpCgkJbnVtX29mX2RpZmZfcHJvZmlsZSsrOwoJaWYoc3RhY2tfaW5mby0+YTJkcF9leGlzdCkKCQludW1fb2ZfZGlmZl9wcm9maWxlKys7CgkKCWlmKG51bV9vZl9kaWZmX3Byb2ZpbGUgPT0gMSkKCXsKCQlpZihzdGFja19pbmZvLT5zY29fZXhpc3QpCgkJewoJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIFNDTyBvbmx5XG4iKSk7CgkJCWFsZ29yaXRobSA9IEJUXzg4MTJBXzFBTlRfQ09FWF9BTEdPX1NDTzsKCQl9CgkJZWxzZQoJCXsKCQkJaWYoc3RhY2tfaW5mby0+aGlkX2V4aXN0KQoJCQl7CgkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIEhJRCBvbmx5XG4iKSk7CgkJCQlhbGdvcml0aG0gPSBCVF84ODEyQV8xQU5UX0NPRVhfQUxHT19ISUQ7CgkJCX0KCQkJZWxzZSBpZihzdGFja19pbmZvLT5hMmRwX2V4aXN0KQoJCQl7CgkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIEEyRFAgb25seVxuIikpOwoJCQkJYWxnb3JpdGhtID0gQlRfODgxMkFfMUFOVF9DT0VYX0FMR09fQTJEUDsKCQkJfQoJCQllbHNlIGlmKHN0YWNrX2luZm8tPnBhbl9leGlzdCkKCQkJewoJCQkJaWYoYnRfaHNfb24pCgkJCQl7CgkJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBQQU4oSFMpIG9ubHlcbiIpKTsKCQkJCQlhbGdvcml0aG0gPSBCVF84ODEyQV8xQU5UX0NPRVhfQUxHT19QQU5IUzsKCQkJCX0KCQkJCWVsc2UKCQkJCXsKCQkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIFBBTihFRFIpIG9ubHlcbiIpKTsKCQkJCQlhbGdvcml0aG0gPSBCVF84ODEyQV8xQU5UX0NPRVhfQUxHT19QQU5FRFI7CgkJCQl9CgkJCX0KCQl9Cgl9CgllbHNlIGlmKG51bV9vZl9kaWZmX3Byb2ZpbGUgPT0gMikKCXsKCQlpZihzdGFja19pbmZvLT5zY29fZXhpc3QpCgkJewoJCQlpZihzdGFja19pbmZvLT5oaWRfZXhpc3QpCgkJCXsKCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgU0NPICsgSElEXG4iKSk7CgkJCQlhbGdvcml0aG0gPSBCVF84ODEyQV8xQU5UX0NPRVhfQUxHT19ISUQ7CgkJCX0KCQkJZWxzZSBpZihzdGFja19pbmZvLT5hMmRwX2V4aXN0KQoJCQl7CgkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIFNDTyArIEEyRFAgPT0+IFNDT1xuIikpOwoJCQkJYWxnb3JpdGhtID0gQlRfODgxMkFfMUFOVF9DT0VYX0FMR09fU0NPOwoJCQl9CgkJCWVsc2UgaWYoc3RhY2tfaW5mby0+cGFuX2V4aXN0KQoJCQl7CgkJCQlpZihidF9oc19vbikKCQkJCXsKCQkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIFNDTyArIFBBTihIUylcbiIpKTsKCQkJCQlhbGdvcml0aG0gPSBCVF84ODEyQV8xQU5UX0NPRVhfQUxHT19TQ087CgkJCQl9CgkJCQllbHNlCgkJCQl7CgkJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBTQ08gKyBQQU4oRURSKVxuIikpOwoJCQkJCWFsZ29yaXRobSA9IEJUXzg4MTJBXzFBTlRfQ09FWF9BTEdPX1BBTkVEUl9ISUQ7CgkJCQl9CgkJCX0KCQl9CgkJZWxzZQoJCXsKCQkJaWYoIHN0YWNrX2luZm8tPmhpZF9leGlzdCAmJgoJCQkJc3RhY2tfaW5mby0+YTJkcF9leGlzdCApCgkJCXsKCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgSElEICsgQTJEUFxuIikpOwoJCQkJYWxnb3JpdGhtID0gQlRfODgxMkFfMUFOVF9DT0VYX0FMR09fSElEX0EyRFA7CgkJCX0KCQkJZWxzZSBpZiggc3RhY2tfaW5mby0+aGlkX2V4aXN0ICYmCgkJCQlzdGFja19pbmZvLT5wYW5fZXhpc3QgKQoJCQl7CgkJCQlpZihidF9oc19vbikKCQkJCXsKCQkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIEhJRCArIFBBTihIUylcbiIpKTsKCQkJCQlhbGdvcml0aG0gPSBCVF84ODEyQV8xQU5UX0NPRVhfQUxHT19ISURfQTJEUDsKCQkJCX0KCQkJCWVsc2UKCQkJCXsKCQkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIEhJRCArIFBBTihFRFIpXG4iKSk7CgkJCQkJYWxnb3JpdGhtID0gQlRfODgxMkFfMUFOVF9DT0VYX0FMR09fUEFORURSX0hJRDsKCQkJCX0KCQkJfQoJCQllbHNlIGlmKCBzdGFja19pbmZvLT5wYW5fZXhpc3QgJiYKCQkJCXN0YWNrX2luZm8tPmEyZHBfZXhpc3QgKQoJCQl7CgkJCQlpZihidF9oc19vbikKCQkJCXsKCQkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIEEyRFAgKyBQQU4oSFMpXG4iKSk7CgkJCQkJYWxnb3JpdGhtID0gQlRfODgxMkFfMUFOVF9DT0VYX0FMR09fQTJEUF9QQU5IUzsKCQkJCX0KCQkJCWVsc2UKCQkJCXsKCQkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIEEyRFAgKyBQQU4oRURSKVxuIikpOwoJCQkJCWFsZ29yaXRobSA9IEJUXzg4MTJBXzFBTlRfQ09FWF9BTEdPX1BBTkVEUl9BMkRQOwoJCQkJfQoJCQl9CgkJfQoJfQoJZWxzZSBpZihudW1fb2ZfZGlmZl9wcm9maWxlID09IDMpCgl7CgkJaWYoc3RhY2tfaW5mby0+c2NvX2V4aXN0KQoJCXsKCQkJaWYoIHN0YWNrX2luZm8tPmhpZF9leGlzdCAmJgoJCQkJc3RhY2tfaW5mby0+YTJkcF9leGlzdCApCgkJCXsKCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgU0NPICsgSElEICsgQTJEUCA9PT4gSElEXG4iKSk7CgkJCQlhbGdvcml0aG0gPSBCVF84ODEyQV8xQU5UX0NPRVhfQUxHT19ISUQ7CgkJCX0KCQkJZWxzZSBpZiggc3RhY2tfaW5mby0+aGlkX2V4aXN0ICYmCgkJCQlzdGFja19pbmZvLT5wYW5fZXhpc3QgKQoJCQl7CgkJCQlpZihidF9oc19vbikKCQkJCXsKCQkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIFNDTyArIEhJRCArIFBBTihIUylcbiIpKTsKCQkJCQlhbGdvcml0aG0gPSBCVF84ODEyQV8xQU5UX0NPRVhfQUxHT19ISURfQTJEUDsKCQkJCX0KCQkJCWVsc2UKCQkJCXsKCQkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIFNDTyArIEhJRCArIFBBTihFRFIpXG4iKSk7CgkJCQkJYWxnb3JpdGhtID0gQlRfODgxMkFfMUFOVF9DT0VYX0FMR09fUEFORURSX0hJRDsKCQkJCX0KCQkJfQoJCQllbHNlIGlmKCBzdGFja19pbmZvLT5wYW5fZXhpc3QgJiYKCQkJCXN0YWNrX2luZm8tPmEyZHBfZXhpc3QgKQoJCQl7CgkJCQlpZihidF9oc19vbikKCQkJCXsKCQkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIFNDTyArIEEyRFAgKyBQQU4oSFMpXG4iKSk7CgkJCQkJYWxnb3JpdGhtID0gQlRfODgxMkFfMUFOVF9DT0VYX0FMR09fU0NPOwoJCQkJfQoJCQkJZWxzZQoJCQkJewoJCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgU0NPICsgQTJEUCArIFBBTihFRFIpID09PiBISURcbiIpKTsKCQkJCQlhbGdvcml0aG0gPSBCVF84ODEyQV8xQU5UX0NPRVhfQUxHT19QQU5FRFJfSElEOwoJCQkJfQoJCQl9CgkJfQoJCWVsc2UKCQl7CgkJCWlmKCBzdGFja19pbmZvLT5oaWRfZXhpc3QgJiYKCQkJCXN0YWNrX2luZm8tPnBhbl9leGlzdCAmJgoJCQkJc3RhY2tfaW5mby0+YTJkcF9leGlzdCApCgkJCXsKCQkJCWlmKGJ0X2hzX29uKQoJCQkJewoJCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgSElEICsgQTJEUCArIFBBTihIUylcbiIpKTsKCQkJCQlhbGdvcml0aG0gPSBCVF84ODEyQV8xQU5UX0NPRVhfQUxHT19ISURfQTJEUDsKCQkJCX0KCQkJCWVsc2UKCQkJCXsKCQkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIEhJRCArIEEyRFAgKyBQQU4oRURSKVxuIikpOwoJCQkJCWFsZ29yaXRobSA9IEJUXzg4MTJBXzFBTlRfQ09FWF9BTEdPX0hJRF9BMkRQX1BBTkVEUjsKCQkJCX0KCQkJfQoJCX0KCX0KCWVsc2UgaWYobnVtX29mX2RpZmZfcHJvZmlsZSA+PSAzKQoJewoJCWlmKHN0YWNrX2luZm8tPnNjb19leGlzdCkKCQl7CgkJCWlmKCBzdGFja19pbmZvLT5oaWRfZXhpc3QgJiYKCQkJCXN0YWNrX2luZm8tPnBhbl9leGlzdCAmJgoJCQkJc3RhY2tfaW5mby0+YTJkcF9leGlzdCApCgkJCXsKCQkJCWlmKGJ0X2hzX29uKQoJCQkJewoJCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgRXJyb3IhISEgU0NPICsgSElEICsgQTJEUCArIFBBTihIUylcbiIpKTsKCgkJCQl9CgkJCQllbHNlCgkJCQl7CgkJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBTQ08gKyBISUQgKyBBMkRQICsgUEFOKEVEUik9PT5QQU4oRURSKStISURcbiIpKTsKCQkJCQlhbGdvcml0aG0gPSBCVF84ODEyQV8xQU5UX0NPRVhfQUxHT19QQU5FRFJfSElEOwoJCQkJfQoJCQl9CgkJfQoJfQoKCXJldHVybiBhbGdvcml0aG07Cn0KCkJPT0xFQU4KaGFsYnRjODgxMmExYW50X05lZWRUb0RlY0J0UHdyKAoJIAlQQlRDX0NPRVhJU1QJCWJ0Y29leGlzdAoJKQp7CglCT09MRUFOCQlyZXQ9ZmFsc2U7CglCT09MRUFOCQlidF9oc19vbj1mYWxzZSwgd2lmaV9jb25uZWN0ZWQ9ZmFsc2U7CglzNEJ5dGUJCWJ0X2hzX3Jzc2k9MDsKCglpZighYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwgQlRDX0dFVF9CTF9IU19PUEVSQVRJT04sICZidF9oc19vbikpCgkJcmV0dXJuIGZhbHNlOwoJaWYoIWJ0Y29leGlzdC0+YnRjX2dldChidGNvZXhpc3QsIEJUQ19HRVRfQkxfV0lGSV9DT05ORUNURUQsICZ3aWZpX2Nvbm5lY3RlZCkpCgkJcmV0dXJuIGZhbHNlOwoJaWYoIWJ0Y29leGlzdC0+YnRjX2dldChidGNvZXhpc3QsIEJUQ19HRVRfUzRfSFNfUlNTSSwgJmJ0X2hzX3Jzc2kpKQoJCXJldHVybiBmYWxzZTsKCglpZih3aWZpX2Nvbm5lY3RlZCkKCXsKCQlpZihidF9oc19vbikKCQl7CgkJCWlmKGJ0X2hzX3Jzc2kgPiAzNykKCQkJewoJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXLCAoIltCVENvZXhdLCBOZWVkIHRvIGRlY3JlYXNlIGJ0IHBvd2VyIGZvciBIUyBtb2RlISFcbiIpKTsKCQkJCXJldCA9IHRydWU7CgkJCX0KCQl9CgkJZWxzZQoJCXsKCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXLCAoIltCVENvZXhdLCBOZWVkIHRvIGRlY3JlYXNlIGJ0IHBvd2VyIGZvciBXaWZpIGlzIGNvbm5lY3RlZCEhXG4iKSk7CgkJCXJldCA9IHRydWU7CgkJfQoJfQoJCglyZXR1cm4gcmV0Owp9Cgp2b2lkCmhhbGJ0Yzg4MTJhMWFudF9TZXRGd0RhY1N3aW5nTGV2ZWwoCgkgCVBCVENfQ09FWElTVAkJYnRjb2V4aXN0LAoJIAl1MUJ5dGUJCQlkYWNfc3dpbmdfbHZsCgkpCnsKCXUxQnl0ZQkJCWgyY19wYXJhbWV0ZXJbMV0gPXswfTsKCgkvLyBUaGVyZSBhcmUgc2V2ZXJhbCB0eXBlIG9mIGRhY3N3aW5nCgkvLyAweDE4LyAweDEwLyAweGMvIDB4OC8gMHg0LyAweDYKCWgyY19wYXJhbWV0ZXJbMF0gPSBkYWNfc3dpbmdfbHZsOwoKCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GV19FWEVDLCAoIltCVENvZXhdLCBTZXQgRGFjIFN3aW5nIExldmVsPTB4JXhcbiIsIGRhY19zd2luZ19sdmwpKTsKCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GV19FWEVDLCAoIltCVENvZXhdLCBGVyB3cml0ZSAweDY0PTB4JXhcbiIsIGgyY19wYXJhbWV0ZXJbMF0pKTsKCglidGNvZXhpc3QtPmJ0Y19maWxsX2gyYyhidGNvZXhpc3QsIDB4NjQsIDEsIGgyY19wYXJhbWV0ZXIpOwp9Cgp2b2lkCmhhbGJ0Yzg4MTJhMWFudF9TZXRGd0RlY0J0UHdyKAoJIAlQQlRDX0NPRVhJU1QJCWJ0Y29leGlzdCwKCSAJQk9PTEVBTgkJCWRlY19idF9wd3IKCSkKewoJdTFCeXRlCWRhdGFMZW49MzsKCXUxQnl0ZQlidWZbNV0gPSB7MH07CgoJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0VYRUMsICgiW0JUQ29leF0sIGRlY3JlYXNlIEJ0IFBvd2VyIDogJXNcbiIsIAoJCQkoZGVjX2J0X3B3cj8gIlllcyEhIjoiTm8hISIpKSk7CgoJYnVmWzBdID0gZGF0YUxlbjsKCWJ1ZlsxXSA9IDB4MzsJCS8vIE9QX0NvZGUKCWJ1ZlsyXSA9IDB4MTsJCS8vIE9QX0NvZGVfTGVuZ3RoCglpZihkZWNfYnRfcHdyKQoJCWJ1ZlszXSA9IDB4MTsJLy8gT1BfQ29kZV9Db250ZW50CgllbHNlCgkJYnVmWzNdID0gMHgwOwoJCQoJYnRjb2V4aXN0LT5idGNfc2V0KGJ0Y29leGlzdCwgQlRDX1NFVF9BQ1RfQ1RSTF9CVF9DT0VYLCAoUFZPSUQpJmJ1ZlswXSk7CQp9Cgp2b2lkCmhhbGJ0Yzg4MTJhMWFudF9EZWNCdFB3cigKCSAJUEJUQ19DT0VYSVNUCQlidGNvZXhpc3QsCgkgCUJPT0xFQU4JCQlmb3JjZV9leGVjLAoJIAlCT09MRUFOCQkJZGVjX2J0X3B3cgoJKQp7CglyZXR1cm47CglCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRlcsICgiW0JUQ29leF0sICVzIERlYyBCVCBwb3dlciA9ICVzXG4iLCAgCgkJKGZvcmNlX2V4ZWM/ICJmb3JjZSB0byI6IiIpLCAoKGRlY19idF9wd3IpPyAiT04iOiJPRkYiKSkpOwoJY29leF9kbS0+Y3VyX2RlY19idF9wd3IgPSBkZWNfYnRfcHdyOwoKCWlmKCFmb3JjZV9leGVjKQoJewoJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GV19ERVRBSUwsICgiW0JUQ29leF0sIHByZV9kZWNfYnRfcHdyPSVkLCBjdXJfZGVjX2J0X3B3cj0lZFxuIiwgCgkJCWNvZXhfZG0tPnByZV9kZWNfYnRfcHdyLCBjb2V4X2RtLT5jdXJfZGVjX2J0X3B3cikpOwoKCQlpZihjb2V4X2RtLT5wcmVfZGVjX2J0X3B3ciA9PSBjb2V4X2RtLT5jdXJfZGVjX2J0X3B3cikgCgkJCXJldHVybjsKCX0KCWhhbGJ0Yzg4MTJhMWFudF9TZXRGd0RlY0J0UHdyKGJ0Y29leGlzdCwgY29leF9kbS0+Y3VyX2RlY19idF9wd3IpOwoKCWNvZXhfZG0tPnByZV9kZWNfYnRfcHdyID0gY29leF9kbS0+Y3VyX2RlY19idF9wd3I7Cn0KCnZvaWQKaGFsYnRjODgxMmExYW50X1NldEZ3QnRMbmFDb25zdHJhaW4oCgkgCVBCVENfQ09FWElTVAkJYnRjb2V4aXN0LAoJIAlCT09MRUFOCQkJYnRfbG5hX2NvbnNfb24KCSkKewoJdTFCeXRlCWRhdGFMZW49MzsKCXUxQnl0ZQlidWZbNV0gPSB7MH07CgoJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0VYRUMsICgiW0JUQ29leF0sIHNldCBCVCBMTkEgQ29uc3RyYWluOiAlc1xuIiwgCgkJKGJ0X2xuYV9jb25zX29uPyAiT04hISI6Ik9GRiEhIikpKTsKCglidWZbMF0gPSBkYXRhTGVuOwoJYnVmWzFdID0gMHgyOwkJLy8gT1BfQ29kZQoJYnVmWzJdID0gMHgxOwkJLy8gT1BfQ29kZV9MZW5ndGgKCWlmKGJ0X2xuYV9jb25zX29uKQoJCWJ1ZlszXSA9IDB4MTsJLy8gT1BfQ29kZV9Db250ZW50CgllbHNlCgkJYnVmWzNdID0gMHgwOwoJCQoJYnRjb2V4aXN0LT5idGNfc2V0KGJ0Y29leGlzdCwgQlRDX1NFVF9BQ1RfQ1RSTF9CVF9DT0VYLCAoUFZPSUQpJmJ1ZlswXSk7CQp9Cgp2b2lkCmhhbGJ0Yzg4MTJhMWFudF9TZXRCdExuYUNvbnN0cmFpbigKCSAJUEJUQ19DT0VYSVNUCQlidGNvZXhpc3QsCgkgCUJPT0xFQU4JCQlmb3JjZV9leGVjLAoJIAlCT09MRUFOCQkJYnRfbG5hX2NvbnNfb24KCSkKewoJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXLCAoIltCVENvZXhdLCAlcyBCVCBDb25zdHJhaW4gPSAlc1xuIiwgIAoJCShmb3JjZV9leGVjPyAiZm9yY2UiOiIiKSwgKChidF9sbmFfY29uc19vbik/ICJPTiI6Ik9GRiIpKSk7Cgljb2V4X2RtLT5iQ3VyQnRMbmFDb25zdHJhaW4gPSBidF9sbmFfY29uc19vbjsKCglpZighZm9yY2VfZXhlYykKCXsKCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfREVUQUlMLCAoIltCVENvZXhdLCBiUHJlQnRMbmFDb25zdHJhaW49JWQsIGJDdXJCdExuYUNvbnN0cmFpbj0lZFxuIiwgCgkJCWNvZXhfZG0tPmJQcmVCdExuYUNvbnN0cmFpbiwgY29leF9kbS0+YkN1ckJ0TG5hQ29uc3RyYWluKSk7CgoJCWlmKGNvZXhfZG0tPmJQcmVCdExuYUNvbnN0cmFpbiA9PSBjb2V4X2RtLT5iQ3VyQnRMbmFDb25zdHJhaW4pIAoJCQlyZXR1cm47Cgl9CgloYWxidGM4ODEyYTFhbnRfU2V0RndCdExuYUNvbnN0cmFpbihidGNvZXhpc3QsIGNvZXhfZG0tPmJDdXJCdExuYUNvbnN0cmFpbik7CgoJY29leF9kbS0+YlByZUJ0TG5hQ29uc3RyYWluID0gY29leF9kbS0+YkN1ckJ0TG5hQ29uc3RyYWluOwp9Cgp2b2lkCmhhbGJ0Yzg4MTJhMWFudF9TZXRGd0J0UHNkTW9kZSgKCSAJUEJUQ19DT0VYSVNUCQlidGNvZXhpc3QsCgkgCXUxQnl0ZQkJCWJ0X3BzZF9tb2RlCgkpCnsKCXUxQnl0ZQlkYXRhTGVuPTM7Cgl1MUJ5dGUJYnVmWzVdID0gezB9OwoKCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GV19FWEVDLCAoIltCVENvZXhdLCBzZXQgQlQgUFNEIG1vZGU9MHgleFxuIiwgCgkJYnRfcHNkX21vZGUpKTsKCglidWZbMF0gPSBkYXRhTGVuOwoJYnVmWzFdID0gMHg0OwkJCS8vIE9QX0NvZGUKCWJ1ZlsyXSA9IDB4MTsJCQkvLyBPUF9Db2RlX0xlbmd0aAoJYnVmWzNdID0gYnRfcHNkX21vZGU7CS8vIE9QX0NvZGVfQ29udGVudAoJCQoJYnRjb2V4aXN0LT5idGNfc2V0KGJ0Y29leGlzdCwgQlRDX1NFVF9BQ1RfQ1RSTF9CVF9DT0VYLCAoUFZPSUQpJmJ1ZlswXSk7CQp9CgoKdm9pZApoYWxidGM4ODEyYTFhbnRfU2V0QnRQc2RNb2RlKAoJIAlQQlRDX0NPRVhJU1QJCWJ0Y29leGlzdCwKCSAJQk9PTEVBTgkJCWZvcmNlX2V4ZWMsCgkgCXUxQnl0ZQkJCWJ0X3BzZF9tb2RlCgkpCnsKCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GVywgKCJbQlRDb2V4XSwgJXMgQlQgUFNEIG1vZGUgPSAweCV4XG4iLCAgCgkJKGZvcmNlX2V4ZWM/ICJmb3JjZSI6IiIpLCBidF9wc2RfbW9kZSkpOwoJY29leF9kbS0+YkN1ckJ0UHNkTW9kZSA9IGJ0X3BzZF9tb2RlOwoKCWlmKCFmb3JjZV9leGVjKQoJewoJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GV19ERVRBSUwsICgiW0JUQ29leF0sIGJQcmVCdFBzZE1vZGU9MHgleCwgYkN1ckJ0UHNkTW9kZT0weCV4XG4iLCAKCQkJY29leF9kbS0+YlByZUJ0UHNkTW9kZSwgY29leF9kbS0+YkN1ckJ0UHNkTW9kZSkpOwoKCQlpZihjb2V4X2RtLT5iUHJlQnRQc2RNb2RlID09IGNvZXhfZG0tPmJDdXJCdFBzZE1vZGUpIAoJCQlyZXR1cm47Cgl9CgloYWxidGM4ODEyYTFhbnRfU2V0RndCdFBzZE1vZGUoYnRjb2V4aXN0LCBjb2V4X2RtLT5iQ3VyQnRQc2RNb2RlKTsKCgljb2V4X2RtLT5iUHJlQnRQc2RNb2RlID0gY29leF9kbS0+YkN1ckJ0UHNkTW9kZTsKfQoKCnZvaWQKaGFsYnRjODgxMmExYW50X1NldEJ0QXV0b1JlcG9ydCgKCSAJUEJUQ19DT0VYSVNUCQlidGNvZXhpc3QsCgkgCUJPT0xFQU4JCQllbmFibGVfYXV0b19yZXBvcnQKCSkKewojaWYgMAoJdTFCeXRlCQkJaDJjX3BhcmFtZXRlclsxXSA9ezB9OwoJCgloMmNfcGFyYW1ldGVyWzBdID0gMDsKCglpZihlbmFibGVfYXV0b19yZXBvcnQpCgl7CgkJaDJjX3BhcmFtZXRlclswXSB8PSBCSVQwOwoJfQoKCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GV19FWEVDLCAoIltCVENvZXhdLCBCVCBGVyBhdXRvIHJlcG9ydCA6ICVzLCBGVyB3cml0ZSAweDY4PTB4JXhcbiIsIAoJCShlbmFibGVfYXV0b19yZXBvcnQ/ICJFbmFibGVkISEiOiJEaXNhYmxlZCEhIiksIGgyY19wYXJhbWV0ZXJbMF0pKTsKCglidGNvZXhpc3QtPmJ0Y19maWxsX2gyYyhidGNvZXhpc3QsIDB4NjgsIDEsIGgyY19wYXJhbWV0ZXIpOwkKI2Vsc2UKCiNlbmRpZgp9Cgp2b2lkCmhhbGJ0Yzg4MTJhMWFudF9CdEF1dG9SZXBvcnQoCgkgCVBCVENfQ09FWElTVAkJYnRjb2V4aXN0LAoJIAlCT09MRUFOCQkJZm9yY2VfZXhlYywKCSAJQk9PTEVBTgkJCWVuYWJsZV9hdXRvX3JlcG9ydAoJKQp7CglCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRlcsICgiW0JUQ29leF0sICVzIEJUIEF1dG8gcmVwb3J0ID0gJXNcbiIsICAKCQkoZm9yY2VfZXhlYz8gImZvcmNlIHRvIjoiIiksICgoZW5hYmxlX2F1dG9fcmVwb3J0KT8gIkVuYWJsZWQiOiJEaXNhYmxlZCIpKSk7Cgljb2V4X2RtLT5jdXJfYnRfYXV0b19yZXBvcnQgPSBlbmFibGVfYXV0b19yZXBvcnQ7CgoJaWYoIWZvcmNlX2V4ZWMpCgl7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0RFVEFJTCwgKCJbQlRDb2V4XSwgcHJlX2J0X2F1dG9fcmVwb3J0PSVkLCBjdXJfYnRfYXV0b19yZXBvcnQ9JWRcbiIsIAoJCQljb2V4X2RtLT5wcmVfYnRfYXV0b19yZXBvcnQsIGNvZXhfZG0tPmN1cl9idF9hdXRvX3JlcG9ydCkpOwoKCQlpZihjb2V4X2RtLT5wcmVfYnRfYXV0b19yZXBvcnQgPT0gY29leF9kbS0+Y3VyX2J0X2F1dG9fcmVwb3J0KSAKCQkJcmV0dXJuOwoJfQoJaGFsYnRjODgxMmExYW50X1NldEJ0QXV0b1JlcG9ydChidGNvZXhpc3QsIGNvZXhfZG0tPmN1cl9idF9hdXRvX3JlcG9ydCk7CgoJY29leF9kbS0+cHJlX2J0X2F1dG9fcmVwb3J0ID0gY29leF9kbS0+Y3VyX2J0X2F1dG9fcmVwb3J0Owp9Cgp2b2lkCmhhbGJ0Yzg4MTJhMWFudF9Gd0RhY1N3aW5nTHZsKAoJIAlQQlRDX0NPRVhJU1QJCWJ0Y29leGlzdCwKCSAJQk9PTEVBTgkJCWZvcmNlX2V4ZWMsCgkgCXUxQnl0ZQkJCWZ3X2RhY19zd2luZ19sdmwKCSkKewoJcmV0dXJuOwoJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXLCAoIltCVENvZXhdLCAlcyBzZXQgRlcgRGFjIFN3aW5nIGxldmVsID0gJWRcbiIsICAKCQkoZm9yY2VfZXhlYz8gImZvcmNlIHRvIjoiIiksIGZ3X2RhY19zd2luZ19sdmwpKTsKCWNvZXhfZG0tPmN1cl9md19kYWNfc3dpbmdfbHZsID0gZndfZGFjX3N3aW5nX2x2bDsKCglpZighZm9yY2VfZXhlYykKCXsKCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfREVUQUlMLCAoIltCVENvZXhdLCBwcmVfZndfZGFjX3N3aW5nX2x2bD0lZCwgY3VyX2Z3X2RhY19zd2luZ19sdmw9JWRcbiIsIAoJCQljb2V4X2RtLT5wcmVfZndfZGFjX3N3aW5nX2x2bCwgY29leF9kbS0+Y3VyX2Z3X2RhY19zd2luZ19sdmwpKTsKCgkJaWYoY29leF9kbS0+cHJlX2Z3X2RhY19zd2luZ19sdmwgPT0gY29leF9kbS0+Y3VyX2Z3X2RhY19zd2luZ19sdmwpIAoJCQlyZXR1cm47Cgl9CgoJaGFsYnRjODgxMmExYW50X1NldEZ3RGFjU3dpbmdMZXZlbChidGNvZXhpc3QsIGNvZXhfZG0tPmN1cl9md19kYWNfc3dpbmdfbHZsKTsKCgljb2V4X2RtLT5wcmVfZndfZGFjX3N3aW5nX2x2bCA9IGNvZXhfZG0tPmN1cl9md19kYWNfc3dpbmdfbHZsOwp9Cgp2b2lkCmhhbGJ0Yzg4MTJhMWFudF9TZXRTd1JmUnhMcGZDb3JuZXIoCgkgCVBCVENfQ09FWElTVAkJYnRjb2V4aXN0LAoJIAlCT09MRUFOCQkJcnhfcmZfc2hyaW5rX29uCgkpCnsKCWlmKHJ4X3JmX3Nocmlua19vbikKCXsKCQkvL1NocmluayBSRiBSeCBMUEYgY29ybmVyCgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXX0VYRUMsICgiW0JUQ29leF0sIFNocmluayBSRiBSeCBMUEYgY29ybmVyISFcbiIpKTsKCQlidGNvZXhpc3QtPmJ0Y19zZXRfcmZfcmVnKGJ0Y29leGlzdCwgQlRDX1JGX0EsIDB4MWUsIDB4ZmZmZmYsIDB4ZjBmZjcpOwoJfQoJZWxzZQoJewoJCS8vUmVzdW1lIFJGIFJ4IExQRiBjb3JuZXIKCQkvLyBBZnRlciBpbml0aWFsaXplZCwgd2UgY2FuIHVzZSBjb2V4X2RtLT5idF9yZjB4MWVfYmFja3VwCgkJaWYoYnRjb2V4aXN0LT5iSW5pdGlsaXplZCkKCQl7CgkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TV19FWEVDLCAoIltCVENvZXhdLCBSZXN1bWUgUkYgUnggTFBGIGNvcm5lciEhXG4iKSk7CgkJCWJ0Y29leGlzdC0+YnRjX3NldF9yZl9yZWcoYnRjb2V4aXN0LCBCVENfUkZfQSwgMHgxZSwgMHhmZmZmZiwgY29leF9kbS0+YnRfcmYweDFlX2JhY2t1cCk7CgkJfQoJfQp9Cgp2b2lkCmhhbGJ0Yzg4MTJhMWFudF9SZlNocmluaygKCSAJUEJUQ19DT0VYSVNUCQlidGNvZXhpc3QsCgkgCUJPT0xFQU4JCQlmb3JjZV9leGVjLAoJIAlCT09MRUFOCQkJcnhfcmZfc2hyaW5rX29uCgkpCnsKCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TVywgKCJbQlRDb2V4XSwgJXMgdHVybiBSeCBSRiBTaHJpbmsgPSAlc1xuIiwgIAoJCShmb3JjZV9leGVjPyAiZm9yY2UgdG8iOiIiKSwgKChyeF9yZl9zaHJpbmtfb24pPyAiT04iOiJPRkYiKSkpOwoJY29leF9kbS0+Y3VyX3JmX3J4X2xwZl9zaHJpbmsgPSByeF9yZl9zaHJpbmtfb247CgoJaWYoIWZvcmNlX2V4ZWMpCgl7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXX0RFVEFJTCwgKCJbQlRDb2V4XSwgcHJlX3JmX3J4X2xwZl9zaHJpbms9JWQsIGN1cl9yZl9yeF9scGZfc2hyaW5rPSVkXG4iLCAKCQkJY29leF9kbS0+cHJlX3JmX3J4X2xwZl9zaHJpbmssIGNvZXhfZG0tPmN1cl9yZl9yeF9scGZfc2hyaW5rKSk7CgoJCWlmKGNvZXhfZG0tPnByZV9yZl9yeF9scGZfc2hyaW5rID09IGNvZXhfZG0tPmN1cl9yZl9yeF9scGZfc2hyaW5rKSAKCQkJcmV0dXJuOwoJfQoJaGFsYnRjODgxMmExYW50X1NldFN3UmZSeExwZkNvcm5lcihidGNvZXhpc3QsIGNvZXhfZG0tPmN1cl9yZl9yeF9scGZfc2hyaW5rKTsKCgljb2V4X2RtLT5wcmVfcmZfcnhfbHBmX3NocmluayA9IGNvZXhfZG0tPmN1cl9yZl9yeF9scGZfc2hyaW5rOwp9Cgp2b2lkCmhhbGJ0Yzg4MTJhMWFudF9TZXRTd1BlbmFsdHlUeFJhdGVBZGFwdGl2ZSgKCSAJUEJUQ19DT0VYSVNUCQlidGNvZXhpc3QsCgkgCUJPT0xFQU4JCQlsb3dfcGVuYWx0eV9yYQoJKQp7Cgl1MUJ5dGUJdTFfdG1wOwoKCXUxX3RtcCA9IGJ0Y29leGlzdC0+YnRjX3JlYWRfMWJ5dGUoYnRjb2V4aXN0LCAweDRmZCk7Cgl1MV90bXAgfD0gQklUMDsKCWlmKGxvd19wZW5hbHR5X3JhKQoJewoJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TV19FWEVDLCAoIltCVENvZXhdLCBUeCByYXRlIGFkYXB0aXZlLCBzZXQgbG93IHBlbmFsdHkhIVxuIikpOwoJCXUxX3RtcCAmPSB+QklUMjsKCX0KCWVsc2UKCXsKCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfU1dfRVhFQywgKCJbQlRDb2V4XSwgVHggcmF0ZSBhZGFwdGl2ZSwgc2V0IG5vcm1hbCEhXG4iKSk7CgkJdTFfdG1wIHw9IEJJVDI7Cgl9CgoJYnRjb2V4aXN0LT5idGNfd3JpdGVfMWJ5dGUoYnRjb2V4aXN0LCAweDRmZCwgdTFfdG1wKTsKfQoKdm9pZApoYWxidGM4ODEyYTFhbnRfTG93UGVuYWx0eVJhKAoJIAlQQlRDX0NPRVhJU1QJCWJ0Y29leGlzdCwKCSAJQk9PTEVBTgkJCWZvcmNlX2V4ZWMsCgkgCUJPT0xFQU4JCQlsb3dfcGVuYWx0eV9yYQoJKQp7CglyZXR1cm47CglCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfU1csICgiW0JUQ29leF0sICVzIHR1cm4gTG93UGVuYWx0eVJBID0gJXNcbiIsICAKCQkoZm9yY2VfZXhlYz8gImZvcmNlIHRvIjoiIiksICgobG93X3BlbmFsdHlfcmEpPyAiT04iOiJPRkYiKSkpOwoJY29leF9kbS0+Y3VyX2xvd19wZW5hbHR5X3JhID0gbG93X3BlbmFsdHlfcmE7CgoJaWYoIWZvcmNlX2V4ZWMpCgl7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXX0RFVEFJTCwgKCJbQlRDb2V4XSwgcHJlX2xvd19wZW5hbHR5X3JhPSVkLCBjdXJfbG93X3BlbmFsdHlfcmE9JWRcbiIsIAoJCQljb2V4X2RtLT5wcmVfbG93X3BlbmFsdHlfcmEsIGNvZXhfZG0tPmN1cl9sb3dfcGVuYWx0eV9yYSkpOwoKCQlpZihjb2V4X2RtLT5wcmVfbG93X3BlbmFsdHlfcmEgPT0gY29leF9kbS0+Y3VyX2xvd19wZW5hbHR5X3JhKSAKCQkJcmV0dXJuOwoJfQoJaGFsYnRjODgxMmExYW50X1NldFN3UGVuYWx0eVR4UmF0ZUFkYXB0aXZlKGJ0Y29leGlzdCwgY29leF9kbS0+Y3VyX2xvd19wZW5hbHR5X3JhKTsKCgljb2V4X2RtLT5wcmVfbG93X3BlbmFsdHlfcmEgPSBjb2V4X2RtLT5jdXJfbG93X3BlbmFsdHlfcmE7Cn0KCnZvaWQKaGFsYnRjODgxMmExYW50X1NldERhY1N3aW5nUmVnKAoJIAlQQlRDX0NPRVhJU1QJCWJ0Y29leGlzdCwKCSAJdTRCeXRlCQkJbGV2ZWwKCSkKewoJdTFCeXRlCXZhbD0odTFCeXRlKWxldmVsOwoKCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TV19FWEVDLCAoIltCVENvZXhdLCBXcml0ZSBTd0RhY1N3aW5nID0gMHgleFxuIiwgbGV2ZWwpKTsKCWJ0Y29leGlzdC0+YnRjX3dyaXRlXzFieXRlX2JpdG1hc2soYnRjb2V4aXN0LCAweGM1YiwgMHgzZSwgdmFsKTsKfQoKdm9pZApoYWxidGM4ODEyYTFhbnRfU2V0U3dGdWxsVGltZURhY1N3aW5nKAoJIAlQQlRDX0NPRVhJU1QJCWJ0Y29leGlzdCwKCSAJQk9PTEVBTgkJCXN3X2RhY19zd2luZ19vbiwKCSAJdTRCeXRlCQkJc3dfZGFjX3N3aW5nX2x2bAoJKQp7CglpZihzd19kYWNfc3dpbmdfb24pCgl7CgkJaGFsYnRjODgxMmExYW50X1NldERhY1N3aW5nUmVnKGJ0Y29leGlzdCwgc3dfZGFjX3N3aW5nX2x2bCk7Cgl9CgllbHNlCgl7CgkJaGFsYnRjODgxMmExYW50X1NldERhY1N3aW5nUmVnKGJ0Y29leGlzdCwgMHgxOCk7Cgl9Cn0KCgp2b2lkCmhhbGJ0Yzg4MTJhMWFudF9EYWNTd2luZygKCSAJUEJUQ19DT0VYSVNUCQlidGNvZXhpc3QsCgkgCUJPT0xFQU4JCQlmb3JjZV9leGVjLAoJIAlCT09MRUFOCQkJZGFjX3N3aW5nX29uLAoJIAl1NEJ5dGUJCQlkYWNfc3dpbmdfbHZsCgkpCnsKCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TVywgKCJbQlRDb2V4XSwgJXMgdHVybiBEYWNTd2luZz0lcywgZGFjX3N3aW5nX2x2bD0weCV4XG4iLCAgCgkJKGZvcmNlX2V4ZWM/ICJmb3JjZSB0byI6IiIpLCAoKGRhY19zd2luZ19vbik/ICJPTiI6Ik9GRiIpLCBkYWNfc3dpbmdfbHZsKSk7Cgljb2V4X2RtLT5jdXJfZGFjX3N3aW5nX29uID0gZGFjX3N3aW5nX29uOwoJY29leF9kbS0+Y3VyX2RhY19zd2luZ19sdmwgPSBkYWNfc3dpbmdfbHZsOwoKCWlmKCFmb3JjZV9leGVjKQoJewoJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TV19ERVRBSUwsICgiW0JUQ29leF0sIHByZV9kYWNfc3dpbmdfb249JWQsIHByZV9kYWNfc3dpbmdfbHZsPTB4JXgsIGN1cl9kYWNfc3dpbmdfb249JWQsIGN1cl9kYWNfc3dpbmdfbHZsPTB4JXhcbiIsIAoJCQljb2V4X2RtLT5wcmVfZGFjX3N3aW5nX29uLCBjb2V4X2RtLT5wcmVfZGFjX3N3aW5nX2x2bCwKCQkJY29leF9kbS0+Y3VyX2RhY19zd2luZ19vbiwgY29leF9kbS0+Y3VyX2RhY19zd2luZ19sdmwpKTsKCgkJaWYoIChjb2V4X2RtLT5wcmVfZGFjX3N3aW5nX29uID09IGNvZXhfZG0tPmN1cl9kYWNfc3dpbmdfb24pICYmCgkJCShjb2V4X2RtLT5wcmVfZGFjX3N3aW5nX2x2bCA9PSBjb2V4X2RtLT5jdXJfZGFjX3N3aW5nX2x2bCkgKQoJCQlyZXR1cm47Cgl9CglkZWxheV9tcygzMCk7CgloYWxidGM4ODEyYTFhbnRfU2V0U3dGdWxsVGltZURhY1N3aW5nKGJ0Y29leGlzdCwgZGFjX3N3aW5nX29uLCBkYWNfc3dpbmdfbHZsKTsKCgljb2V4X2RtLT5wcmVfZGFjX3N3aW5nX29uID0gY29leF9kbS0+Y3VyX2RhY19zd2luZ19vbjsKCWNvZXhfZG0tPnByZV9kYWNfc3dpbmdfbHZsID0gY29leF9kbS0+Y3VyX2RhY19zd2luZ19sdmw7Cn0KCnZvaWQKaGFsYnRjODgxMmExYW50X1NldEFkY0JhY2tPZmYoCgkgCVBCVENfQ09FWElTVAkJYnRjb2V4aXN0LAoJIAlCT09MRUFOCQkJYWRjX2JhY2tfb2ZmCgkpCnsKCWlmKGFkY19iYWNrX29mZikKCXsKCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfU1dfRVhFQywgKCJbQlRDb2V4XSwgQkIgQmFja09mZiBMZXZlbCBPbiFcbiIpKTsKCQlidGNvZXhpc3QtPmJ0Y193cml0ZV8xYnl0ZV9iaXRtYXNrKGJ0Y29leGlzdCwgMHg4ZGIsIDB4NjAsIDB4Myk7Cgl9CgllbHNlCgl7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXX0VYRUMsICgiW0JUQ29leF0sIEJCIEJhY2tPZmYgTGV2ZWwgT2ZmIVxuIikpOwoJCWJ0Y29leGlzdC0+YnRjX3dyaXRlXzFieXRlX2JpdG1hc2soYnRjb2V4aXN0LCAweDhkYiwgMHg2MCwgMHgxKTsKCX0KfQoKdm9pZApoYWxidGM4ODEyYTFhbnRfQWRjQmFja09mZigKCSAJUEJUQ19DT0VYSVNUCQlidGNvZXhpc3QsCgkgCUJPT0xFQU4JCQlmb3JjZV9leGVjLAoJIAlCT09MRUFOCQkJYWRjX2JhY2tfb2ZmCgkpCnsKCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TVywgKCJbQlRDb2V4XSwgJXMgdHVybiBBZGNCYWNrT2ZmID0gJXNcbiIsICAKCQkoZm9yY2VfZXhlYz8gImZvcmNlIHRvIjoiIiksICgoYWRjX2JhY2tfb2ZmKT8gIk9OIjoiT0ZGIikpKTsKCWNvZXhfZG0tPmN1cl9hZGNfYmFja19vZmYgPSBhZGNfYmFja19vZmY7CgoJaWYoIWZvcmNlX2V4ZWMpCgl7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXX0RFVEFJTCwgKCJbQlRDb2V4XSwgcHJlX2FkY19iYWNrX29mZj0lZCwgY3VyX2FkY19iYWNrX29mZj0lZFxuIiwgCgkJCWNvZXhfZG0tPnByZV9hZGNfYmFja19vZmYsIGNvZXhfZG0tPmN1cl9hZGNfYmFja19vZmYpKTsKCgkJaWYoY29leF9kbS0+cHJlX2FkY19iYWNrX29mZiA9PSBjb2V4X2RtLT5jdXJfYWRjX2JhY2tfb2ZmKSAKCQkJcmV0dXJuOwoJfQoJaGFsYnRjODgxMmExYW50X1NldEFkY0JhY2tPZmYoYnRjb2V4aXN0LCBjb2V4X2RtLT5jdXJfYWRjX2JhY2tfb2ZmKTsKCgljb2V4X2RtLT5wcmVfYWRjX2JhY2tfb2ZmID0gY29leF9kbS0+Y3VyX2FkY19iYWNrX29mZjsKfQoKdm9pZApoYWxidGM4ODEyYTFhbnRfU2V0QWdjVGFibGUoCgkgCVBCVENfQ09FWElTVAkJYnRjb2V4aXN0LAoJIAlCT09MRUFOCQkJYWdjX3RhYmxlX2VuCgkpCnsKCXUxQnl0ZQkJcnNzaV9hZGp1c3RfdmFsPTA7CgkKCWJ0Y29leGlzdC0+YnRjX3NldF9yZl9yZWcoYnRjb2V4aXN0LCBCVENfUkZfQSwgMHhlZiwgMHhmZmZmZiwgMHgwMjAwMCk7CglpZihhZ2NfdGFibGVfZW4pCgl7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXX0VYRUMsICgiW0JUQ29leF0sIEFnYyBUYWJsZSBPbiFcbiIpKTsKCQlidGNvZXhpc3QtPmJ0Y19zZXRfcmZfcmVnKGJ0Y29leGlzdCwgQlRDX1JGX0EsIDB4M2IsIDB4ZmZmZmYsIDB4M2ZhNTgpOwoJCWJ0Y29leGlzdC0+YnRjX3NldF9yZl9yZWcoYnRjb2V4aXN0LCBCVENfUkZfQSwgMHgzYiwgMHhmZmZmZiwgMHgzN2E1OCk7CgkJYnRjb2V4aXN0LT5idGNfc2V0X3JmX3JlZyhidGNvZXhpc3QsIEJUQ19SRl9BLCAweDNiLCAweGZmZmZmLCAweDJmYTU4KTsKCQlyc3NpX2FkanVzdF92YWwgPSA4OwoJfQoJZWxzZQoJewoJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TV19FWEVDLCAoIltCVENvZXhdLCBBZ2MgVGFibGUgT2ZmIVxuIikpOwoJCWJ0Y29leGlzdC0+YnRjX3NldF9yZl9yZWcoYnRjb2V4aXN0LCBCVENfUkZfQSwgMHgzYiwgMHhmZmZmZiwgMHgzOTI1OCk7CgkJYnRjb2V4aXN0LT5idGNfc2V0X3JmX3JlZyhidGNvZXhpc3QsIEJUQ19SRl9BLCAweDNiLCAweGZmZmZmLCAweDMxMjU4KTsKCQlidGNvZXhpc3QtPmJ0Y19zZXRfcmZfcmVnKGJ0Y29leGlzdCwgQlRDX1JGX0EsIDB4M2IsIDB4ZmZmZmYsIDB4MjkyNTgpOwoJfQoJYnRjb2V4aXN0LT5idGNfc2V0X3JmX3JlZyhidGNvZXhpc3QsIEJUQ19SRl9BLCAweGVmLCAweGZmZmZmLCAweDApOwoKCS8vIHNldCByc3NpX2FkanVzdF92YWwgZm9yIHdpZmkgbW9kdWxlLgoJYnRjb2V4aXN0LT5idGNfc2V0KGJ0Y29leGlzdCwgQlRDX1NFVF9VMV9SU1NJX0FESl9WQUxfRk9SX0FHQ19UQUJMRV9PTiwgJnJzc2lfYWRqdXN0X3ZhbCk7Cn0KCgp2b2lkCmhhbGJ0Yzg4MTJhMWFudF9BZ2NUYWJsZSgKCSAJUEJUQ19DT0VYSVNUCQlidGNvZXhpc3QsCgkgCUJPT0xFQU4JCQlmb3JjZV9leGVjLAoJIAlCT09MRUFOCQkJYWdjX3RhYmxlX2VuCgkpCnsKCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TVywgKCJbQlRDb2V4XSwgJXMgJXMgQWdjIFRhYmxlXG4iLCAgCgkJKGZvcmNlX2V4ZWM/ICJmb3JjZSB0byI6IiIpLCAoKGFnY190YWJsZV9lbik/ICJFbmFibGUiOiJEaXNhYmxlIikpKTsKCWNvZXhfZG0tPmN1cl9hZ2NfdGFibGVfZW4gPSBhZ2NfdGFibGVfZW47CgoJaWYoIWZvcmNlX2V4ZWMpCgl7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXX0RFVEFJTCwgKCJbQlRDb2V4XSwgcHJlX2FnY190YWJsZV9lbj0lZCwgY3VyX2FnY190YWJsZV9lbj0lZFxuIiwgCgkJCWNvZXhfZG0tPnByZV9hZ2NfdGFibGVfZW4sIGNvZXhfZG0tPmN1cl9hZ2NfdGFibGVfZW4pKTsKCgkJaWYoY29leF9kbS0+cHJlX2FnY190YWJsZV9lbiA9PSBjb2V4X2RtLT5jdXJfYWdjX3RhYmxlX2VuKSAKCQkJcmV0dXJuOwoJfQoJaGFsYnRjODgxMmExYW50X1NldEFnY1RhYmxlKGJ0Y29leGlzdCwgYWdjX3RhYmxlX2VuKTsKCgljb2V4X2RtLT5wcmVfYWdjX3RhYmxlX2VuID0gY29leF9kbS0+Y3VyX2FnY190YWJsZV9lbjsKfQoKdm9pZApoYWxidGM4ODEyYTFhbnRfU2V0Q29leFRhYmxlKAoJIAlQQlRDX0NPRVhJU1QJYnRjb2V4aXN0LAoJIAl1NEJ5dGUJCXZhbDB4NmMwLAoJIAl1NEJ5dGUJCXZhbDB4NmM0LAoJIAl1NEJ5dGUJCXZhbDB4NmM4LAoJIAl1MUJ5dGUJCXZhbDB4NmNjCgkpCnsKCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TV19FWEVDLCAoIltCVENvZXhdLCBzZXQgY29leCB0YWJsZSwgc2V0IDB4NmMwPTB4JXhcbiIsIHZhbDB4NmMwKSk7CglidGNvZXhpc3QtPmJ0Y193cml0ZV80Ynl0ZShidGNvZXhpc3QsIDB4NmMwLCB2YWwweDZjMCk7CgoJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXX0VYRUMsICgiW0JUQ29leF0sIHNldCBjb2V4IHRhYmxlLCBzZXQgMHg2YzQ9MHgleFxuIiwgdmFsMHg2YzQpKTsKCWJ0Y29leGlzdC0+YnRjX3dyaXRlXzRieXRlKGJ0Y29leGlzdCwgMHg2YzQsIHZhbDB4NmM0KTsKCglCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfU1dfRVhFQywgKCJbQlRDb2V4XSwgc2V0IGNvZXggdGFibGUsIHNldCAweDZjOD0weCV4XG4iLCB2YWwweDZjOCkpOwoJYnRjb2V4aXN0LT5idGNfd3JpdGVfNGJ5dGUoYnRjb2V4aXN0LCAweDZjOCwgdmFsMHg2YzgpOwoKCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TV19FWEVDLCAoIltCVENvZXhdLCBzZXQgY29leCB0YWJsZSwgc2V0IDB4NmNjPTB4JXhcbiIsIHZhbDB4NmNjKSk7CglidGNvZXhpc3QtPmJ0Y193cml0ZV8xYnl0ZShidGNvZXhpc3QsIDB4NmNjLCB2YWwweDZjYyk7Cn0KCnZvaWQKaGFsYnRjODgxMmExYW50X0NvZXhUYWJsZSgKCSAJUEJUQ19DT0VYSVNUCQlidGNvZXhpc3QsCgkgCUJPT0xFQU4JCQlmb3JjZV9leGVjLAoJIAl1NEJ5dGUJCQl2YWwweDZjMCwKCSAJdTRCeXRlCQkJdmFsMHg2YzQsCgkgCXU0Qnl0ZQkJCXZhbDB4NmM4LAoJIAl1MUJ5dGUJCQl2YWwweDZjYwoJKQp7CglCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfU1csICgiW0JUQ29leF0sICVzIHdyaXRlIENvZXggVGFibGUgMHg2YzA9MHgleCwgMHg2YzQ9MHgleCwgMHg2Yzg9MHgleCwgMHg2Y2M9MHgleFxuIiwgCgkJKGZvcmNlX2V4ZWM/ICJmb3JjZSB0byI6IiIpLCB2YWwweDZjMCwgdmFsMHg2YzQsIHZhbDB4NmM4LCB2YWwweDZjYykpOwoJY29leF9kbS0+Y3VyX3ZhbDB4NmMwID0gdmFsMHg2YzA7Cgljb2V4X2RtLT5jdXJfdmFsMHg2YzQgPSB2YWwweDZjNDsKCWNvZXhfZG0tPmN1cl92YWwweDZjOCA9IHZhbDB4NmM4OwoJY29leF9kbS0+Y3VyX3ZhbDB4NmNjID0gdmFsMHg2Y2M7CgoJaWYoIWZvcmNlX2V4ZWMpCgl7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXX0RFVEFJTCwgKCJbQlRDb2V4XSwgcHJlX3ZhbDB4NmMwPTB4JXgsIHByZV92YWwweDZjND0weCV4LCBwcmVfdmFsMHg2Yzg9MHgleCwgcHJlX3ZhbDB4NmNjPTB4JXggISFcbiIsIAoJCQljb2V4X2RtLT5wcmVfdmFsMHg2YzAsIGNvZXhfZG0tPnByZV92YWwweDZjNCwgY29leF9kbS0+cHJlX3ZhbDB4NmM4LCBjb2V4X2RtLT5wcmVfdmFsMHg2Y2MpKTsKCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfU1dfREVUQUlMLCAoIltCVENvZXhdLCBjdXJfdmFsMHg2YzA9MHgleCwgY3VyX3ZhbDB4NmM0PTB4JXgsIGN1cl92YWwweDZjOD0weCV4LCBjdXJfdmFsMHg2Y2M9MHgleCAhIVxuIiwgCgkJCWNvZXhfZG0tPmN1cl92YWwweDZjMCwgY29leF9kbS0+Y3VyX3ZhbDB4NmM0LCBjb2V4X2RtLT5jdXJfdmFsMHg2YzgsIGNvZXhfZG0tPmN1cl92YWwweDZjYykpOwoJCgkJaWYoIChjb2V4X2RtLT5wcmVfdmFsMHg2YzAgPT0gY29leF9kbS0+Y3VyX3ZhbDB4NmMwKSAmJgoJCQkoY29leF9kbS0+cHJlX3ZhbDB4NmM0ID09IGNvZXhfZG0tPmN1cl92YWwweDZjNCkgJiYKCQkJKGNvZXhfZG0tPnByZV92YWwweDZjOCA9PSBjb2V4X2RtLT5jdXJfdmFsMHg2YzgpICYmCgkJCShjb2V4X2RtLT5wcmVfdmFsMHg2Y2MgPT0gY29leF9kbS0+Y3VyX3ZhbDB4NmNjKSApCgkJCXJldHVybjsKCX0KCWhhbGJ0Yzg4MTJhMWFudF9TZXRDb2V4VGFibGUoYnRjb2V4aXN0LCB2YWwweDZjMCwgdmFsMHg2YzQsIHZhbDB4NmM4LCB2YWwweDZjYyk7CgoJY29leF9kbS0+cHJlX3ZhbDB4NmMwID0gY29leF9kbS0+Y3VyX3ZhbDB4NmMwOwoJY29leF9kbS0+cHJlX3ZhbDB4NmM0ID0gY29leF9kbS0+Y3VyX3ZhbDB4NmM0OwoJY29leF9kbS0+cHJlX3ZhbDB4NmM4ID0gY29leF9kbS0+Y3VyX3ZhbDB4NmM4OwoJY29leF9kbS0+cHJlX3ZhbDB4NmNjID0gY29leF9kbS0+Y3VyX3ZhbDB4NmNjOwp9Cgp2b2lkCmhhbGJ0Yzg4MTJhMWFudF9TZXRGd0lnbm9yZVdsYW5BY3QoCgkgCVBCVENfQ09FWElTVAkJYnRjb2V4aXN0LAoJIAlCT09MRUFOCQkJZW5hYmxlCgkpCnsKCXUxQnl0ZQlkYXRhTGVuPTM7Cgl1MUJ5dGUJYnVmWzVdID0gezB9OwoKCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GV19FWEVDLCAoIltCVENvZXhdLCAlcyBCVCBJZ25vcmUgV2xhbl9BY3RcbiIsCgkJKGVuYWJsZT8gIkVuYWJsZSI6IkRpc2FibGUiKSkpOwoKCWJ1ZlswXSA9IGRhdGFMZW47CglidWZbMV0gPSAweDE7CQkJLy8gT1BfQ29kZQoJYnVmWzJdID0gMHgxOwkJCS8vIE9QX0NvZGVfTGVuZ3RoCglpZihlbmFibGUpCgkJYnVmWzNdID0gMHgxOyAJCS8vIE9QX0NvZGVfQ29udGVudAoJZWxzZQoJCWJ1ZlszXSA9IDB4MDsKCQkKCWJ0Y29leGlzdC0+YnRjX3NldChidGNvZXhpc3QsIEJUQ19TRVRfQUNUX0NUUkxfQlRfQ09FWCwgKFBWT0lEKSZidWZbMF0pOwkKfQoKdm9pZApoYWxidGM4ODEyYTFhbnRfSWdub3JlV2xhbkFjdCgKCSAJUEJUQ19DT0VYSVNUCQlidGNvZXhpc3QsCgkgCUJPT0xFQU4JCQlmb3JjZV9leGVjLAoJIAlCT09MRUFOCQkJZW5hYmxlCgkpCnsKCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GVywgKCJbQlRDb2V4XSwgJXMgdHVybiBJZ25vcmUgV2xhbkFjdCAlc1xuIiwgCgkJKGZvcmNlX2V4ZWM/ICJmb3JjZSB0byI6IiIpLCAoZW5hYmxlPyAiT04iOiJPRkYiKSkpOwoJY29leF9kbS0+Y3VyX2lnbm9yZV93bGFuX2FjdCA9IGVuYWJsZTsKCglpZighZm9yY2VfZXhlYykKCXsKCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfREVUQUlMLCAoIltCVENvZXhdLCBwcmVfaWdub3JlX3dsYW5fYWN0ID0gJWQsIGN1cl9pZ25vcmVfd2xhbl9hY3QgPSAlZCEhXG4iLCAKCQkJY29leF9kbS0+cHJlX2lnbm9yZV93bGFuX2FjdCwgY29leF9kbS0+Y3VyX2lnbm9yZV93bGFuX2FjdCkpOwoKCQlpZihjb2V4X2RtLT5wcmVfaWdub3JlX3dsYW5fYWN0ID09IGNvZXhfZG0tPmN1cl9pZ25vcmVfd2xhbl9hY3QpCgkJCXJldHVybjsKCX0KCWhhbGJ0Yzg4MTJhMWFudF9TZXRGd0lnbm9yZVdsYW5BY3QoYnRjb2V4aXN0LCBlbmFibGUpOwoKCWNvZXhfZG0tPnByZV9pZ25vcmVfd2xhbl9hY3QgPSBjb2V4X2RtLT5jdXJfaWdub3JlX3dsYW5fYWN0Owp9Cgp2b2lkCmhhbGJ0Yzg4MTJhMWFudF9TZXRGd1BzdGRtYSgKCSAJUEJUQ19DT0VYSVNUCQlidGNvZXhpc3QsCgkgCXUxQnl0ZQkJCWJ5dGUxLAoJIAl1MUJ5dGUJCQlieXRlMiwKCSAJdTFCeXRlCQkJYnl0ZTMsCgkgCXUxQnl0ZQkJCWJ5dGU0LAoJIAl1MUJ5dGUJCQlieXRlNQoJKQp7Cgl1MUJ5dGUJCQloMmNfcGFyYW1ldGVyWzVdID17MH07CgoJaDJjX3BhcmFtZXRlclswXSA9IGJ5dGUxOwkKCWgyY19wYXJhbWV0ZXJbMV0gPSBieXRlMjsJCgloMmNfcGFyYW1ldGVyWzJdID0gYnl0ZTM7CgloMmNfcGFyYW1ldGVyWzNdID0gYnl0ZTQ7CgloMmNfcGFyYW1ldGVyWzRdID0gYnl0ZTU7CgoJY29leF9kbS0+cHNfdGRtYV9wYXJhWzBdID0gYnl0ZTE7Cgljb2V4X2RtLT5wc190ZG1hX3BhcmFbMV0gPSBieXRlMjsKCWNvZXhfZG0tPnBzX3RkbWFfcGFyYVsyXSA9IGJ5dGUzOwoJY29leF9kbS0+cHNfdGRtYV9wYXJhWzNdID0gYnl0ZTQ7Cgljb2V4X2RtLT5wc190ZG1hX3BhcmFbNF0gPSBieXRlNTsKCQoJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0VYRUMsICgiW0JUQ29leF0sIEZXIHdyaXRlIDB4NjAoNWJ5dGVzKT0weCV4JTA4eFxuIiwgCgkJaDJjX3BhcmFtZXRlclswXSwgCgkJaDJjX3BhcmFtZXRlclsxXTw8MjR8aDJjX3BhcmFtZXRlclsyXTw8MTZ8aDJjX3BhcmFtZXRlclszXTw8OHxoMmNfcGFyYW1ldGVyWzRdKSk7CgoJYnRjb2V4aXN0LT5idGNfZmlsbF9oMmMoYnRjb2V4aXN0LCAweDYwLCA1LCBoMmNfcGFyYW1ldGVyKTsKfQoKdm9pZApoYWxidGM4ODEyYTFhbnRfU2V0THBzUnB3bSgKCSAJUEJUQ19DT0VYSVNUCQlidGNvZXhpc3QsCgkgCXUxQnl0ZQkJCWxwc192YWwsCgkgCXUxQnl0ZQkJCXJwd21fdmFsCgkpCnsKCXUxQnl0ZQlscHM9bHBzX3ZhbDsKCXUxQnl0ZQlycHdtPXJwd21fdmFsOwoJCglidGNvZXhpc3QtPmJ0Y19zZXQoYnRjb2V4aXN0LCBCVENfU0VUX1UxXzFBTlRfTFBTLCAmbHBzKTsKCWJ0Y29leGlzdC0+YnRjX3NldChidGNvZXhpc3QsIEJUQ19TRVRfVTFfMUFOVF9SUFdNLCAmcnB3bSk7CgkKCWJ0Y29leGlzdC0+YnRjX3NldChidGNvZXhpc3QsIEJUQ19TRVRfQUNUX0lOQ19GT1JDRV9FWEVDX1BXUl9DTURfQ05ULCBOVUxMKTsKfQoKdm9pZApoYWxidGM4ODEyYTFhbnRfTHBzUnB3bSgKCSAJUEJUQ19DT0VYSVNUCQlidGNvZXhpc3QsCgkgCUJPT0xFQU4JCQlmb3JjZV9leGVjLAoJIAl1MUJ5dGUJCQlscHNfdmFsLAoJIAl1MUJ5dGUJCQlycHdtX3ZhbAoJKQp7CglCT09MRUFOCWJGb3JjZUV4ZWNQd3JDbWQ9ZmFsc2U7CgkKCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GVywgKCJbQlRDb2V4XSwgJXMgc2V0IGxwcy9ycHdtPTB4JXgvMHgleCBcbiIsIAoJCShmb3JjZV9leGVjPyAiZm9yY2UgdG8iOiIiKSwgbHBzX3ZhbCwgcnB3bV92YWwpKTsKCWNvZXhfZG0tPmN1cl9scHMgPSBscHNfdmFsOwoJY29leF9kbS0+Y3VyX3Jwd20gPSBycHdtX3ZhbDsKCglpZighZm9yY2VfZXhlYykKCXsKCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfREVUQUlMLCAoIltCVENvZXhdLCBwcmVfbHBzL2N1cl9scHM9MHgleC8weCV4LCBwcmVfcnB3bS9jdXJfcnB3bT0weCV4LzB4JXghIVxuIiwgCgkJCWNvZXhfZG0tPnByZV9scHMsIGNvZXhfZG0tPmN1cl9scHMsIGNvZXhfZG0tPnByZV9ycHdtLCBjb2V4X2RtLT5jdXJfcnB3bSkpOwoKCQlpZiggKGNvZXhfZG0tPnByZV9scHMgPT0gY29leF9kbS0+Y3VyX2xwcykgJiYKCQkJKGNvZXhfZG0tPnByZV9ycHdtID09IGNvZXhfZG0tPmN1cl9ycHdtKSApCgkJewoJCQlyZXR1cm47CgkJfQoJfQoJaGFsYnRjODgxMmExYW50X1NldExwc1Jwd20oYnRjb2V4aXN0LCBscHNfdmFsLCBycHdtX3ZhbCk7CgoJY29leF9kbS0+cHJlX2xwcyA9IGNvZXhfZG0tPmN1cl9scHM7Cgljb2V4X2RtLT5wcmVfcnB3bSA9IGNvZXhfZG0tPmN1cl9ycHdtOwp9Cgp2b2lkCmhhbGJ0Yzg4MTJhMWFudF9Td01lY2hhbmlzbTEoCgkgCVBCVENfQ09FWElTVAlidGNvZXhpc3QsCQoJIAlCT09MRUFOCQlzaHJpbmtfcnhfbHBmLAoJIAlCT09MRUFOIAlsb3dfcGVuYWx0eV9yYSwKCSAJQk9PTEVBTgkJbGltaXRlZF9kaWcsIAoJIAlCT09MRUFOCQlidF9sbmFfY29uc3RyYWluCgkpIAp7CgkvL2hhbGJ0Yzg4MTJhMWFudF9SZlNocmluayhidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCBzaHJpbmtfcnhfbHBmKTsKCS8vaGFsYnRjODgxMmExYW50X0xvd1BlbmFsdHlSYShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCBsb3dfcGVuYWx0eV9yYSk7CgoJLy9ubyBsaW1pdGVkIERJRwoJLy9oYWxidGM4ODEyYTFhbnRfU2V0QnRMbmFDb25zdHJhaW4oYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgYnRfbG5hX2NvbnN0cmFpbik7Cn0KCnZvaWQKaGFsYnRjODgxMmExYW50X1N3TWVjaGFuaXNtMigKCSAJUEJUQ19DT0VYSVNUCWJ0Y29leGlzdCwJCgkgCUJPT0xFQU4JCWFnY190YWJsZV9zaGlmdCwKCSAJQk9PTEVBTiAJYWRjX2JhY2tfb2ZmLAoJIAlCT09MRUFOCQlzd19kYWNfc3dpbmcsCgkgCXU0Qnl0ZQkJZGFjX3N3aW5nX2x2bAoJKQp7CgkvL2hhbGJ0Yzg4MTJhMWFudF9BZ2NUYWJsZShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCBhZ2NfdGFibGVfc2hpZnQpOwoJLy9oYWxidGM4ODEyYTFhbnRfQWRjQmFja09mZihidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCBhZGNfYmFja19vZmYpOwoJLy9oYWxidGM4ODEyYTFhbnRfRGFjU3dpbmcoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgc3dfZGFjX3N3aW5nLCBkYWNfc3dpbmdfbHZsKTsKfQoKdm9pZApoYWxidGM4ODEyYTFhbnRfUHNUZG1hKAoJIAlQQlRDX0NPRVhJU1QJCWJ0Y29leGlzdCwKCSAJQk9PTEVBTgkJCWZvcmNlX2V4ZWMsCgkgCUJPT0xFQU4JCQl0dXJuX29uLAoJIAl1MUJ5dGUJCQl0eXBlCgkpCnsKCUJPT0xFQU4JCQliVHVybk9uQnlDbnQ9ZmFsc2U7Cgl1MUJ5dGUJCQlwc1RkbWFUeXBlQnlDbnQ9MCwgcnNzaV9hZGp1c3RfdmFsPTA7CgoJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXLCAoIltCVENvZXhdLCAlcyB0dXJuICVzIFBTIFRETUEsIHR5cGU9JWRcbiIsIAoJCShmb3JjZV9leGVjPyAiZm9yY2UgdG8iOiIiKSwgKHR1cm5fb24/ICJPTiI6Ik9GRiIpLCB0eXBlKSk7Cgljb2V4X2RtLT5jdXJfcHNfdGRtYV9vbiA9IHR1cm5fb247Cgljb2V4X2RtLT5jdXJfcHNfdGRtYSA9IHR5cGU7CgoJaWYoIWZvcmNlX2V4ZWMpCgl7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0RFVEFJTCwgKCJbQlRDb2V4XSwgcHJlX3BzX3RkbWFfb24gPSAlZCwgY3VyX3BzX3RkbWFfb24gPSAlZCEhXG4iLCAKCQkJY29leF9kbS0+cHJlX3BzX3RkbWFfb24sIGNvZXhfZG0tPmN1cl9wc190ZG1hX29uKSk7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0RFVEFJTCwgKCJbQlRDb2V4XSwgcHJlX3BzX3RkbWEgPSAlZCwgY3VyX3BzX3RkbWEgPSAlZCEhXG4iLCAKCQkJY29leF9kbS0+cHJlX3BzX3RkbWEsIGNvZXhfZG0tPmN1cl9wc190ZG1hKSk7CgoJCWlmKCAoY29leF9kbS0+cHJlX3BzX3RkbWFfb24gPT0gY29leF9kbS0+Y3VyX3BzX3RkbWFfb24pICYmCgkJCShjb2V4X2RtLT5wcmVfcHNfdGRtYSA9PSBjb2V4X2RtLT5jdXJfcHNfdGRtYSkgKQoJCQlyZXR1cm47Cgl9CglpZih0dXJuX29uKQoJewoJCXN3aXRjaCh0eXBlKQoJCXsKCQkJZGVmYXVsdDoKCQkJCWhhbGJ0Yzg4MTJhMWFudF9TZXRGd1BzdGRtYShidGNvZXhpc3QsIDB4ZDMsIDB4MWEsIDB4MWEsIDB4MCwgMHg1OCk7CgkJCQlicmVhazsKCQkJY2FzZSAxOgoJCQkJaGFsYnRjODgxMmExYW50X1NldEZ3UHN0ZG1hKGJ0Y29leGlzdCwgMHhkMywgMHgxYSwgMHgxYSwgMHgwLCAweDQ4KTsKCQkJCXJzc2lfYWRqdXN0X3ZhbCA9IDExOwoJCQkJYnJlYWs7CgkJCWNhc2UgMjoKCQkJCWhhbGJ0Yzg4MTJhMWFudF9TZXRGd1BzdGRtYShidGNvZXhpc3QsIDB4ZDMsIDB4MTIsIDB4MTIsIDB4MCwgMHg0OCk7CgkJCQlyc3NpX2FkanVzdF92YWwgPSAxNDsKCQkJCWJyZWFrOwoJCQljYXNlIDM6CgkJCQloYWxidGM4ODEyYTFhbnRfU2V0RndQc3RkbWEoYnRjb2V4aXN0LCAweDkzLCAweDI1LCAweDMsIDB4MTAsIDB4NDApOwoJCQkJYnJlYWs7CgkJCWNhc2UgNDoKCQkJCWhhbGJ0Yzg4MTJhMWFudF9TZXRGd1BzdGRtYShidGNvZXhpc3QsIDB4OTMsIDB4MTUsIDB4MywgMHgxNCwgMHgwKTsKCQkJCXJzc2lfYWRqdXN0X3ZhbCA9IDE3OwoJCQkJYnJlYWs7CgkJCWNhc2UgNToKCQkJCWhhbGJ0Yzg4MTJhMWFudF9TZXRGd1BzdGRtYShidGNvZXhpc3QsIDB4NjEsIDB4MTUsIDB4MywgMHgzMSwgMHgwKTsKCQkJCWJyZWFrOwoJCQljYXNlIDY6CgkJCQloYWxidGM4ODEyYTFhbnRfU2V0RndQc3RkbWEoYnRjb2V4aXN0LCAweDEzLCAweGEsIDB4MywgMHgwLCAweDApOwoJCQkJYnJlYWs7CgkJCWNhc2UgNzoKCQkJCWhhbGJ0Yzg4MTJhMWFudF9TZXRGd1BzdGRtYShidGNvZXhpc3QsIDB4MTMsIDB4YywgMHg1LCAweDAsIDB4MCk7CgkJCQlicmVhazsKCQkJY2FzZSA4OgkKCQkJCWhhbGJ0Yzg4MTJhMWFudF9TZXRGd1BzdGRtYShidGNvZXhpc3QsIDB4OTMsIDB4MjUsIDB4MywgMHgxMCwgMHgwKTsKCQkJCWJyZWFrOwoJCQljYXNlIDk6CQoJCQkJaGFsYnRjODgxMmExYW50X1NldEZ3UHN0ZG1hKGJ0Y29leGlzdCwgMHhkMywgMHhhLCAweGEsIDB4MCwgMHg0OCk7CgkJCQlyc3NpX2FkanVzdF92YWwgPSAxODsKCQkJCWJyZWFrOwoJCQljYXNlIDEwOgkKCQkJCWhhbGJ0Yzg4MTJhMWFudF9TZXRGd1BzdGRtYShidGNvZXhpc3QsIDB4MTMsIDB4YSwgMHhhLCAweDAsIDB4NDApOwoJCQkJYnJlYWs7CgkJCWNhc2UgMTE6CQoJCQkJaGFsYnRjODgxMmExYW50X1NldEZ3UHN0ZG1hKGJ0Y29leGlzdCwgMHhkMywgMHg1LCAweDUsIDB4MCwgMHg0OCk7CgkJCQlyc3NpX2FkanVzdF92YWwgPSAyMDsKCQkJCWJyZWFrOwoJCQljYXNlIDEyOgoJCQkJaGFsYnRjODgxMmExYW50X1NldEZ3UHN0ZG1hKGJ0Y29leGlzdCwgMHhlYiwgMHhhLCAweDMsIDB4MzEsIDB4MTgpOwoJCQkJYnJlYWs7CgoJCQljYXNlIDE1OgoJCQkJaGFsYnRjODgxMmExYW50X1NldEZ3UHN0ZG1hKGJ0Y29leGlzdCwgMHgxMywgMHhhLCAweDMsIDB4OCwgMHgwKTsKCQkJCWJyZWFrOwoJCQljYXNlIDE2OgoJCQkJaGFsYnRjODgxMmExYW50X1NldEZ3UHN0ZG1hKGJ0Y29leGlzdCwgMHg5MywgMHgxNSwgMHgzLCAweDEwLCAweDApOwoJCQkJcnNzaV9hZGp1c3RfdmFsID0gMTg7CgkJCQlicmVhazsKCgkJCWNhc2UgMTg6CgkJCQloYWxidGM4ODEyYTFhbnRfU2V0RndQc3RkbWEoYnRjb2V4aXN0LCAweDkzLCAweDI1LCAweDMsIDB4MTAsIDB4MCk7CgkJCQlyc3NpX2FkanVzdF92YWwgPSAxNDsKCQkJCWJyZWFrOwkJCQoJCQkJCgkJCWNhc2UgMjA6CgkJCQloYWxidGM4ODEyYTFhbnRfU2V0RndQc3RkbWEoYnRjb2V4aXN0LCAweDEzLCAweDI1LCAweDI1LCAweDAsIDB4MCk7CgkJCQlicmVhazsKCQkJY2FzZSAyMToKCQkJCWhhbGJ0Yzg4MTJhMWFudF9TZXRGd1BzdGRtYShidGNvZXhpc3QsIDB4OTMsIDB4MjAsIDB4MywgMHgxMCwgMHg0MCk7CgkJCQlicmVhazsKCQkJY2FzZSAyMjoKCQkJCWhhbGJ0Yzg4MTJhMWFudF9TZXRGd1BzdGRtYShidGNvZXhpc3QsIDB4MTMsIDB4OCwgMHg4LCAweDAsIDB4NDApOwoJCQkJYnJlYWs7CgkJCWNhc2UgMjM6CgkJCQloYWxidGM4ODEyYTFhbnRfU2V0RndQc3RkbWEoYnRjb2V4aXN0LCAweGUzLCAweDI1LCAweDMsIDB4MzEsIDB4MTgpOwoJCQkJcnNzaV9hZGp1c3RfdmFsID0gMjI7CgkJCQlicmVhazsKCQkJY2FzZSAyNDoKCQkJCWhhbGJ0Yzg4MTJhMWFudF9TZXRGd1BzdGRtYShidGNvZXhpc3QsIDB4ZTMsIDB4MTUsIDB4MywgMHgzMSwgMHgxOCk7CgkJCQlyc3NpX2FkanVzdF92YWwgPSAyMjsKCQkJCWJyZWFrOwoJCQljYXNlIDI1OgoJCQkJaGFsYnRjODgxMmExYW50X1NldEZ3UHN0ZG1hKGJ0Y29leGlzdCwgMHhlMywgMHhhLCAweDMsIDB4MzEsIDB4MTgpOwoJCQkJcnNzaV9hZGp1c3RfdmFsID0gMjI7CgkJCQlicmVhazsKCQkJY2FzZSAyNjoKCQkJCWhhbGJ0Yzg4MTJhMWFudF9TZXRGd1BzdGRtYShidGNvZXhpc3QsIDB4ZTMsIDB4YSwgMHgzLCAweDMxLCAweDE4KTsKCQkJCXJzc2lfYWRqdXN0X3ZhbCA9IDIyOwoJCQkJYnJlYWs7CgkJCWNhc2UgMjc6CgkJCQloYWxidGM4ODEyYTFhbnRfU2V0RndQc3RkbWEoYnRjb2V4aXN0LCAweGUzLCAweDI1LCAweDMsIDB4MzEsIDB4OTgpOwoJCQkJcnNzaV9hZGp1c3RfdmFsID0gMjI7CgkJCQlicmVhazsKCQkJY2FzZSAyODoKCQkJCWhhbGJ0Yzg4MTJhMWFudF9TZXRGd1BzdGRtYShidGNvZXhpc3QsIDB4NjksIDB4MjUsIDB4MywgMHgzMSwgMHgwKTsKCQkJCWJyZWFrOwoJCQljYXNlIDI5OgoJCQkJaGFsYnRjODgxMmExYW50X1NldEZ3UHN0ZG1hKGJ0Y29leGlzdCwgMHhhYiwgMHgxYSwgMHgxYSwgMHgxLCAweDgpOwoJCQkJYnJlYWs7CgkJCWNhc2UgMzA6CgkJCQloYWxidGM4ODEyYTFhbnRfU2V0RndQc3RkbWEoYnRjb2V4aXN0LCAweDkzLCAweDE1LCAweDMsIDB4MTQsIDB4MCk7CgkJCQlicmVhazsKCQkJY2FzZSAzMToKCQkJCWhhbGJ0Yzg4MTJhMWFudF9TZXRGd1BzdGRtYShidGNvZXhpc3QsIDB4ZDMsIDB4MWEsIDB4MWEsIDAsIDB4NTgpOwoJCQkJYnJlYWs7CgkJCWNhc2UgMzI6CgkJCQloYWxidGM4ODEyYTFhbnRfU2V0RndQc3RkbWEoYnRjb2V4aXN0LCAweGFiLCAweGEsIDB4MywgMHgzMSwgMHg4OCk7CgkJCQlicmVhazsKCQkJY2FzZSAzMzoKCQkJCWhhbGJ0Yzg4MTJhMWFudF9TZXRGd1BzdGRtYShidGNvZXhpc3QsIDB4YTMsIDB4MjUsIDB4MywgMHgzMCwgMHg4OCk7CgkJCQlicmVhazsKCQkJY2FzZSAzNDoKCQkJCWhhbGJ0Yzg4MTJhMWFudF9TZXRGd1BzdGRtYShidGNvZXhpc3QsIDB4ZDMsIDB4MWEsIDB4MWEsIDB4MCwgMHg4KTsKCQkJCWJyZWFrOwoJCQljYXNlIDM1OgoJCQkJaGFsYnRjODgxMmExYW50X1NldEZ3UHN0ZG1hKGJ0Y29leGlzdCwgMHhlMywgMHgxYSwgMHgxYSwgMHgwLCAweDgpOwoJCQkJYnJlYWs7CgkJCWNhc2UgMzY6CgkJCQloYWxidGM4ODEyYTFhbnRfU2V0RndQc3RkbWEoYnRjb2V4aXN0LCAweGQzLCAweDEyLCAweDMsIDB4MTQsIDB4NTgpOwoJCQkJYnJlYWs7CgkJfQoJfQoJZWxzZQoJewoJCS8vIGRpc2FibGUgUFMgdGRtYQoJCXN3aXRjaCh0eXBlKQoJCXsKCQkJY2FzZSA4OgoJCQkJaGFsYnRjODgxMmExYW50X1NldEZ3UHN0ZG1hKGJ0Y29leGlzdCwgMHg4LCAweDAsIDB4MCwgMHgwLCAweDApOwoJCQkJYnRjb2V4aXN0LT5idGNfd3JpdGVfMWJ5dGUoYnRjb2V4aXN0LCAweDkyYywgMHg0KTsKCQkJCWJyZWFrOwoJCQljYXNlIDA6CgkJCWRlZmF1bHQ6CgkJCQloYWxidGM4ODEyYTFhbnRfU2V0RndQc3RkbWEoYnRjb2V4aXN0LCAweDAsIDB4MCwgMHgwLCAweDAsIDB4MCk7CgkJCQlkZWxheV9tcyg1KTsKCQkJCWJ0Y29leGlzdC0+YnRjX3dyaXRlXzFieXRlKGJ0Y29leGlzdCwgMHg5MmMsIDB4MjApOwoJCQkJYnJlYWs7CgkJCWNhc2UgOToKCQkJCWhhbGJ0Yzg4MTJhMWFudF9TZXRGd1BzdGRtYShidGNvZXhpc3QsIDB4MCwgMHgwLCAweDAsIDB4MCwgMHgwKTsKCQkJCWJ0Y29leGlzdC0+YnRjX3dyaXRlXzFieXRlKGJ0Y29leGlzdCwgMHg5MmMsIDB4NCk7CgkJCQlicmVhazsKCQkJY2FzZSAxMDoKCQkJCWhhbGJ0Yzg4MTJhMWFudF9TZXRGd1BzdGRtYShidGNvZXhpc3QsIDB4MCwgMHgwLCAweDAsIDB4OCwgMHgwKTsKCQkJCWRlbGF5X21zKDUpOwoJCQkJYnRjb2V4aXN0LT5idGNfd3JpdGVfMWJ5dGUoYnRjb2V4aXN0LCAweDkyYywgMHgyMCk7CgkJCQlicmVhazsKCQl9Cgl9Cglyc3NpX2FkanVzdF92YWwgPTA7CglidGNvZXhpc3QtPmJ0Y19zZXQoYnRjb2V4aXN0LCBCVENfU0VUX1UxX1JTU0lfQURKX1ZBTF9GT1JfMUFOVF9DT0VYX1RZUEUsICZyc3NpX2FkanVzdF92YWwpOwoKCS8vIHVwZGF0ZSBwcmUgc3RhdGUKCWNvZXhfZG0tPnByZV9wc190ZG1hX29uID0gY29leF9kbS0+Y3VyX3BzX3RkbWFfb247Cgljb2V4X2RtLT5wcmVfcHNfdGRtYSA9IGNvZXhfZG0tPmN1cl9wc190ZG1hOwp9Cgp2b2lkCmhhbGJ0Yzg4MTJhMWFudF9Db2V4QWxsT2ZmKAoJIAlQQlRDX0NPRVhJU1QJCWJ0Y29leGlzdAoJKQp7CgkvLyBmdyBhbGwgb2ZmCgloYWxidGM4ODEyYTFhbnRfRndEYWNTd2luZ0x2bChidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCA2KTsKCWhhbGJ0Yzg4MTJhMWFudF9EZWNCdFB3cihidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCBmYWxzZSk7CgoJLy8gc3cgYWxsIG9mZgoJaGFsYnRjODgxMmExYW50X1N3TWVjaGFuaXNtMShidGNvZXhpc3QsZmFsc2UsZmFsc2UsZmFsc2UsZmFsc2UpOwoJaGFsYnRjODgxMmExYW50X1N3TWVjaGFuaXNtMihidGNvZXhpc3QsZmFsc2UsZmFsc2UsZmFsc2UsMHgxOCk7CgoKCS8vIGh3IGFsbCBvZmYKCWhhbGJ0Yzg4MTJhMWFudF9Db2V4VGFibGUoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgMHg1NTU1NTU1NSwgMHg1NTU1NTU1NSwgMHhmZmZmLCAweDMpOwp9Cgp2b2lkCmhhbGJ0Yzg4MTJhMWFudF9XaWZpUGFyYUFkanVzdCgKCSAJUEJUQ19DT0VYSVNUCQlidGNvZXhpc3QsCgkgCUJPT0xFQU4JCQllbmFibGUKCSkKewoJaWYoZW5hYmxlKQoJewoJCWhhbGJ0Yzg4MTJhMWFudF9Mb3dQZW5hbHR5UmEoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSk7Cgl9CgllbHNlCgl7CgkJaGFsYnRjODgxMmExYW50X0xvd1BlbmFsdHlSYShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCBmYWxzZSk7Cgl9Cn0KCkJPT0xFQU4KaGFsYnRjODgxMmExYW50X0lzQ29tbW9uQWN0aW9uKAoJIAlQQlRDX0NPRVhJU1QJCWJ0Y29leGlzdAoJKQp7CglCT09MRUFOCQkJY29tbW9uPWZhbHNlLCB3aWZpX2Nvbm5lY3RlZD1mYWxzZSwgd2lmaV9idXN5PWZhbHNlOwoKCWJ0Y29leGlzdC0+YnRjX2dldChidGNvZXhpc3QsIEJUQ19HRVRfQkxfV0lGSV9DT05ORUNURUQsICZ3aWZpX2Nvbm5lY3RlZCk7CglidGNvZXhpc3QtPmJ0Y19nZXQoYnRjb2V4aXN0LCBCVENfR0VUX0JMX1dJRklfQlVTWSwgJndpZmlfYnVzeSk7CgoJLy9oYWxidGM4ODEyYTFhbnRfQ29leFRhYmxlKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDB4NTU1NTU1NTUsIDB4NTU1NTU1NTUsIDB4ZmZmZiwgMHgzKTsKCglpZighd2lmaV9jb25uZWN0ZWQgJiYgCgkJQlRfODgxMkFfMUFOVF9CVF9TVEFUVVNfTk9OX0NPTk5FQ1RFRF9JRExFID09IGNvZXhfZG0tPmJ0X3N0YXR1cykKCXsKCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIFdpZmkgbm9uIGNvbm5lY3RlZC1pZGxlICsgQlQgbm9uIGNvbm5lY3RlZC1pZGxlISFcbiIpKTsKCQloYWxidGM4ODEyYTFhbnRfRndEYWNTd2luZ0x2bChidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCA2KTsKCQloYWxidGM4ODEyYTFhbnRfRGVjQnRQd3IoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgZmFsc2UpOwoJCQogCQloYWxidGM4ODEyYTFhbnRfU3dNZWNoYW5pc20xKGJ0Y29leGlzdCxmYWxzZSxmYWxzZSxmYWxzZSxmYWxzZSk7CgkJaGFsYnRjODgxMmExYW50X1N3TWVjaGFuaXNtMihidGNvZXhpc3QsZmFsc2UsZmFsc2UsZmFsc2UsMHgxOCk7CgoJCWNvbW1vbiA9IHRydWU7Cgl9CgllbHNlIGlmKHdpZmlfY29ubmVjdGVkICYmIAoJCShCVF84ODEyQV8xQU5UX0JUX1NUQVRVU19OT05fQ09OTkVDVEVEX0lETEUgPT0gY29leF9kbS0+YnRfc3RhdHVzKSApCgl7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBXaWZpIGNvbm5lY3RlZCArIEJUIG5vbiBjb25uZWN0ZWQtaWRsZSEhXG4iKSk7CgkJaGFsYnRjODgxMmExYW50X0Z3RGFjU3dpbmdMdmwoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgNik7CgkJaGFsYnRjODgxMmExYW50X0RlY0J0UHdyKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUpOwoKICAgICAgCQloYWxidGM4ODEyYTFhbnRfU3dNZWNoYW5pc20xKGJ0Y29leGlzdCxmYWxzZSxmYWxzZSxmYWxzZSxmYWxzZSk7CgkJaGFsYnRjODgxMmExYW50X1N3TWVjaGFuaXNtMihidGNvZXhpc3QsZmFsc2UsZmFsc2UsZmFsc2UsMHgxOCk7CgoJCWNvbW1vbiA9IHRydWU7Cgl9CgllbHNlIGlmKCF3aWZpX2Nvbm5lY3RlZCAmJiAKCQkoQlRfODgxMkFfMUFOVF9CVF9TVEFUVVNfQ09OTkVDVEVEX0lETEUgPT0gY29leF9kbS0+YnRfc3RhdHVzKSApCgl7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBXaWZpIG5vbiBjb25uZWN0ZWQtaWRsZSArIEJUIGNvbm5lY3RlZC1pZGxlISFcbiIpKTsKCQloYWxidGM4ODEyYTFhbnRfRndEYWNTd2luZ0x2bChidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCA2KTsKCQloYWxidGM4ODEyYTFhbnRfRGVjQnRQd3IoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgZmFsc2UpOwoKCQloYWxidGM4ODEyYTFhbnRfU3dNZWNoYW5pc20xKGJ0Y29leGlzdCxmYWxzZSxmYWxzZSxmYWxzZSxmYWxzZSk7CgkJaGFsYnRjODgxMmExYW50X1N3TWVjaGFuaXNtMihidGNvZXhpc3QsZmFsc2UsZmFsc2UsZmFsc2UsMHgxOCk7CgoJCWNvbW1vbiA9IHRydWU7Cgl9CgllbHNlIGlmKHdpZmlfY29ubmVjdGVkICYmIAoJCShCVF84ODEyQV8xQU5UX0JUX1NUQVRVU19DT05ORUNURURfSURMRSA9PSBjb2V4X2RtLT5idF9zdGF0dXMpICkKCXsKCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIFdpZmkgY29ubmVjdGVkICsgQlQgY29ubmVjdGVkLWlkbGUhIVxuIikpOwoJCWhhbGJ0Yzg4MTJhMWFudF9Gd0RhY1N3aW5nTHZsKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDYpOwoJCWhhbGJ0Yzg4MTJhMWFudF9EZWNCdFB3cihidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCBmYWxzZSk7CgoJCWhhbGJ0Yzg4MTJhMWFudF9Td01lY2hhbmlzbTEoYnRjb2V4aXN0LHRydWUsdHJ1ZSx0cnVlLHRydWUpOwoJCWhhbGJ0Yzg4MTJhMWFudF9Td01lY2hhbmlzbTIoYnRjb2V4aXN0LGZhbHNlLGZhbHNlLGZhbHNlLDB4MTgpOwoKCQljb21tb24gPSB0cnVlOwoJfQoJZWxzZSBpZighd2lmaV9jb25uZWN0ZWQgJiYgCgkJKEJUXzg4MTJBXzFBTlRfQlRfU1RBVFVTX0NPTk5FQ1RFRF9JRExFICE9IGNvZXhfZG0tPmJ0X3N0YXR1cykgKQoJewoJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgV2lmaSBub24gY29ubmVjdGVkLWlkbGUgKyBCVCBCdXN5ISFcbiIpKTsKCQloYWxidGM4ODEyYTFhbnRfRndEYWNTd2luZ0x2bChidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCA2KTsKCQloYWxidGM4ODEyYTFhbnRfRGVjQnRQd3IoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgZmFsc2UpOwoKCQloYWxidGM4ODEyYTFhbnRfU3dNZWNoYW5pc20xKGJ0Y29leGlzdCxmYWxzZSxmYWxzZSxmYWxzZSxmYWxzZSk7CgkJaGFsYnRjODgxMmExYW50X1N3TWVjaGFuaXNtMihidGNvZXhpc3QsZmFsc2UsZmFsc2UsZmFsc2UsMHgxOCk7CgkJCgkJY29tbW9uID0gdHJ1ZTsKCX0KCWVsc2UKCXsKCQloYWxidGM4ODEyYTFhbnRfU3dNZWNoYW5pc20xKGJ0Y29leGlzdCx0cnVlLHRydWUsdHJ1ZSx0cnVlKTsKCQkKCQljb21tb24gPSBmYWxzZTsKCX0KCQoJcmV0dXJuIGNvbW1vbjsKfQoKCnZvaWQKaGFsYnRjODgxMmExYW50X1RkbWFEdXJhdGlvbkFkanVzdEZvckFjbCgKCSAJUEJUQ19DT0VYSVNUCQlidGNvZXhpc3QKCSkKewoJc3RhdGljIHM0Qnl0ZQkJdXAsZG4sbSxuLHdhaXRfY291bnQ7CglzNEJ5dGUJCQlyZXN1bHQ7ICAgLy8wOiBubyBjaGFuZ2UsICsxOiBpbmNyZWFzZSBXaUZpIGR1cmF0aW9uLCAtMTogZGVjcmVhc2UgV2lGaSBkdXJhdGlvbgoJdTFCeXRlCQkJcmV0cnlfY291bnQ9MCwgYnRfaW5mb19leHQ7CgoJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXLCAoIltCVENvZXhdLCBoYWxidGM4ODEyYTFhbnRfVGRtYUR1cmF0aW9uQWRqdXN0Rm9yQWNsKClcbiIpKTsKCWlmKGNvZXhfZG0tPnJlc2V0X3RkbWFfYWRqdXN0KQoJewoJCWNvZXhfZG0tPnJlc2V0X3RkbWFfYWRqdXN0ID0gZmFsc2U7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0RFVEFJTCwgKCJbQlRDb2V4XSwgZmlyc3QgcnVuIFRkbWFEdXJhdGlvbkFkanVzdCgpISFcbiIpKTsKCgkJaGFsYnRjODgxMmExYW50X1BzVGRtYShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAyKTsKCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlID0gMjsKCQkvLz09PT09PT09PT09PQoJCXVwID0gMDsKCQlkbiA9IDA7CgkJbSA9IDE7CgkJbj0gMzsKCQlyZXN1bHQgPSAwOwoJCXdhaXRfY291bnQgPSAwOwoJfQoJZWxzZQoJewoJCS8vYWNxdWlyZSB0aGUgQlQgVFJ4IHJldHJ5IGNvdW50IGZyb20gQlRfSW5mbyBieXRlMgoJCXJldHJ5X2NvdW50ID0gY29leF9zdGEtPmJ0X3JldHJ5X2NudDsKCQlidF9pbmZvX2V4dCA9IGNvZXhfc3RhLT5idF9pbmZvX2V4dDsKCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfREVUQUlMLCAoIltCVENvZXhdLCByZXRyeV9jb3VudCA9ICVkXG4iLCByZXRyeV9jb3VudCkpOwoJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GV19ERVRBSUwsICgiW0JUQ29leF0sIHVwPSVkLCBkbj0lZCwgbT0lZCwgbj0lZCwgd2FpdF9jb3VudD0lZFxuIiwgCgkJCXVwLCBkbiwgbSwgbiwgd2FpdF9jb3VudCkpOwoJCXJlc3VsdCA9IDA7CgkJd2FpdF9jb3VudCsrOyAKCQkgIAoJCWlmKHJldHJ5X2NvdW50ID09IDApICAvLyBubyByZXRyeSBpbiB0aGUgbGFzdCAyLXNlY29uZCBkdXJhdGlvbgoJCXsKCQkJdXArKzsKCQkJZG4tLTsKCgkJCWlmIChkbiA8PSAwKQoJCQkJZG4gPSAwOwkJCQkgCgoJCQlpZih1cCA+PSBuKQkvLyBpZiCzc8TyIG4grdMyrO0gcmV0cnkgY291bnSssDAsIKtovdW8ZVdpRmkgZHVyYXRpb24KCQkJewoJCQkJd2FpdF9jb3VudCA9IDA7IAoJCQkJbiA9IDM7CgkJCQl1cCA9IDA7CgkJCQlkbiA9IDA7CgkJCQlyZXN1bHQgPSAxOyAKCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GV19ERVRBSUwsICgiW0JUQ29leF0sIEluY3JlYXNlIHdpZmkgZHVyYXRpb24hIVxuIikpOwoJCQl9CgkJfQoJCWVsc2UgaWYgKHJldHJ5X2NvdW50IDw9IDMpCS8vIDw9MyByZXRyeSBpbiB0aGUgbGFzdCAyLXNlY29uZCBkdXJhdGlvbgoJCXsKCQkJdXAtLTsgCgkJCWRuKys7CgoJCQlpZiAodXAgPD0gMCkKCQkJCXVwID0gMDsKCgkJCWlmIChkbiA9PSAyKQkvLyBpZiCzc8TyIDIgrdMyrO0gcmV0cnkgY291bnQ8IDMsIKtovdWvtldpRmkgZHVyYXRpb24KCQkJewoJCQkJaWYgKHdhaXRfY291bnQgPD0gMikKCQkJCQltKys7IC8vIMHXp0ukQKq9pmKo4q3TbGV2ZWykpKjTpl4KCQkJCWVsc2UKCQkJCQltID0gMTsKCgkJCQlpZiAoIG0gPj0gMjApIC8vbSCzzKRqrcggPSAyMCAnILPMpGoxMjCs7SByZWNoZWNrrE+nX73VvuMgV2lGaSBkdXJhdGlvbi4KCQkJCQltID0gMjA7CgoJCQkJbiA9IDMqbTsKCQkJCXVwID0gMDsKCQkJCWRuID0gMDsKCQkJCXdhaXRfY291bnQgPSAwOwoJCQkJcmVzdWx0ID0gLTE7IAoJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0RFVEFJTCwgKCJbQlRDb2V4XSwgRGVjcmVhc2Ugd2lmaSBkdXJhdGlvbiBmb3IgcmV0cnlDb3VudGVyPDMhIVxuIikpOwoJCQl9CgkJfQoJCWVsc2UgIC8vcmV0cnkgY291bnQgPiAzLCClda1uMaa4IHJldHJ5IGNvdW50ID4gMywgq2i91a+2V2lGaSBkdXJhdGlvbgoJCXsKCQkJaWYgKHdhaXRfY291bnQgPT0gMSkKCQkJCW0rKzsgLy8gwdenS6RAqr2mYqjirdNsZXZlbKSkqNOmXgoJCQllbHNlCgkJCQltID0gMTsKCgkJCWlmICggbSA+PSAyMCkgLy9tILPMpGqtyCA9IDIwICcgs8ykajEyMKztIHJlY2hlY2usT6dfvdW+4yBXaUZpIGR1cmF0aW9uLgoJCQkJbSA9IDIwOwoKCQkJbiA9IDMqbTsKCQkJdXAgPSAwOwoJCQlkbiA9IDA7CgkJCXdhaXRfY291bnQgPSAwOyAKCQkJcmVzdWx0ID0gLTE7CgkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GV19ERVRBSUwsICgiW0JUQ29leF0sIERlY3JlYXNlIHdpZmkgZHVyYXRpb24gZm9yIHJldHJ5Q291bnRlcj4zISFcbiIpKTsKCQl9CgoJCWlmKHJlc3VsdCA9PSAtMSkKCQl7CgkJCWlmKCAoQlRfSU5GT184ODEyQV8xQU5UX0EyRFBfQkFTSUNfUkFURShidF9pbmZvX2V4dCkpICYmCgkJCQkoKGNvZXhfZG0tPmN1cl9wc190ZG1hID09IDEpIHx8KGNvZXhfZG0tPmN1cl9wc190ZG1hID09IDIpKSApCgkJCXsKCQkJCWhhbGJ0Yzg4MTJhMWFudF9Qc1RkbWEoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgOSk7CgkJCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlID0gOTsKCQkJfQoJCQllbHNlIGlmKGNvZXhfZG0tPmN1cl9wc190ZG1hID09IDEpCgkJCXsKCQkJCWhhbGJ0Yzg4MTJhMWFudF9Qc1RkbWEoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMik7CgkJCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlID0gMjsKCQkJfQoJCQllbHNlIGlmKGNvZXhfZG0tPmN1cl9wc190ZG1hID09IDIpCgkJCXsKCQkJCWhhbGJ0Yzg4MTJhMWFudF9Qc1RkbWEoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgOSk7CgkJCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlID0gOTsKCQkJfQoJCQllbHNlIGlmKGNvZXhfZG0tPmN1cl9wc190ZG1hID09IDkpCgkJCXsKCQkJCWhhbGJ0Yzg4MTJhMWFudF9Qc1RkbWEoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMTEpOwoJCQkJY29leF9kbS0+cHNfdGRtYV9kdV9hZGpfdHlwZSA9IDExOwoJCQl9CgkJfQoJCWVsc2UgaWYocmVzdWx0ID09IDEpCgkJewoJCQlpZiggKEJUX0lORk9fODgxMkFfMUFOVF9BMkRQX0JBU0lDX1JBVEUoYnRfaW5mb19leHQpKSAmJgoJCQkJKChjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSAxKSB8fChjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSAyKSkgKQoJCQl7CgkJCQloYWxidGM4ODEyYTFhbnRfUHNUZG1hKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDkpOwoJCQkJY29leF9kbS0+cHNfdGRtYV9kdV9hZGpfdHlwZSA9IDk7CgkJCX0KCQkJZWxzZSBpZihjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSAxMSkKCQkJewoJCQkJaGFsYnRjODgxMmExYW50X1BzVGRtYShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCA5KTsKCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPSA5OwoJCQl9CgkJCWVsc2UgaWYoY29leF9kbS0+Y3VyX3BzX3RkbWEgPT0gOSkKCQkJewoJCQkJaGFsYnRjODgxMmExYW50X1BzVGRtYShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAyKTsKCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPSAyOwoJCQl9CgkJCWVsc2UgaWYoY29leF9kbS0+Y3VyX3BzX3RkbWEgPT0gMikKCQkJewoJCQkJaGFsYnRjODgxMmExYW50X1BzVGRtYShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAxKTsKCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPSAxOwoJCQl9CgkJfQoKCQlpZiggY29leF9kbS0+Y3VyX3BzX3RkbWEgIT0gMSAmJgoJCQljb2V4X2RtLT5jdXJfcHNfdGRtYSAhPSAyICYmCgkJCWNvZXhfZG0tPmN1cl9wc190ZG1hICE9IDkgJiYKCQkJY29leF9kbS0+Y3VyX3BzX3RkbWEgIT0gMTEgKQoJCXsKCQkJLy8gcmVjb3ZlciB0byBwcmV2aW91cyBhZGp1c3QgdHlwZQoJCQloYWxidGM4ODEyYTFhbnRfUHNUZG1hKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIGNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUpOwoJCX0KCX0KfQoKdTFCeXRlCmhhbGJ0Yzg4MTJhMWFudF9Qc1RkbWFUeXBlQnlXaWZpUnNzaSgKCSAJczRCeXRlCXdpZmlfcnNzaSwKCSAJczRCeXRlCXByZV93aWZpX3Jzc2ksCgkgCXUxQnl0ZQl3aWZpX3Jzc2lfdGhyZXNoCgkpCnsKCXUxQnl0ZQlwc190ZG1hX3R5cGU9MDsKCQoJaWYod2lmaV9yc3NpID4gcHJlX3dpZmlfcnNzaSkKCXsKCQlpZih3aWZpX3Jzc2kgPiAod2lmaV9yc3NpX3RocmVzaCs1KSkKCQl7CgkJCXBzX3RkbWFfdHlwZSA9IDI2OwoJCX0KCQllbHNlCgkJewoJCQlwc190ZG1hX3R5cGUgPSAyNTsKCQl9Cgl9CgllbHNlCgl7CgkJaWYod2lmaV9yc3NpID4gd2lmaV9yc3NpX3RocmVzaCkKCQl7CgkJCXBzX3RkbWFfdHlwZSA9IDI2OwoJCX0KCQllbHNlCgkJewoJCQlwc190ZG1hX3R5cGUgPSAyNTsKCQl9Cgl9CgoJcmV0dXJuIHBzX3RkbWFfdHlwZTsKfQoKdm9pZApoYWxidGM4ODEyYTFhbnRfUHNUZG1hQ2hlY2tGb3JQb3dlclNhdmVTdGF0ZSgKCSAJUEJUQ19DT0VYSVNUCQlidGNvZXhpc3QsCgkgCUJPT0xFQU4JCQluZXdfcHNfc3RhdGUKCSkKewoJdTFCeXRlCWxwc19tb2RlPTB4MDsKCglidGNvZXhpc3QtPmJ0Y19nZXQoYnRjb2V4aXN0LCBCVENfR0VUX1UxX0xQU19NT0RFLCAmbHBzX21vZGUpOwoJCglpZihscHNfbW9kZSkJLy8gYWxyZWFkeSB1bmRlciBMUFMgc3RhdGUKCXsKCQlpZihuZXdfcHNfc3RhdGUpCQkKCQl7CgkJCS8vIGtlZXAgc3RhdGUgdW5kZXIgTFBTLCBkbyBub3RoaW5nLgoJCX0KCQllbHNlCgkJewoJCQkvLyB3aWxsIGxlYXZlIExQUyBzdGF0ZSwgdHVybiBvZmYgcHNUZG1hIGZpcnN0CgkJCWhhbGJ0Yzg4MTJhMWFudF9Qc1RkbWEoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgZmFsc2UsIDApOwoJCX0KCX0KCWVsc2UJCQkJCQkvLyBOTyBQUyBzdGF0ZQoJewoJCWlmKG5ld19wc19zdGF0ZSkKCQl7CgkJCS8vIHdpbGwgZW50ZXIgTFBTIHN0YXRlLCB0dXJuIG9mZiBwc1RkbWEgZmlyc3QKCQkJaGFsYnRjODgxMmExYW50X1BzVGRtYShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCBmYWxzZSwgMCk7CgkJfQoJCWVsc2UKCQl7CgkJCS8vIGtlZXAgc3RhdGUgdW5kZXIgTk8gUFMgc3RhdGUsIGRvIG5vdGhpbmcuCgkJfQoJfQp9CgovLyBTQ08gb25seSBvciBTQ08rUEFOKEhTKQp2b2lkCmhhbGJ0Yzg4MTJhMWFudF9BY3Rpb25TY28oCgkgCVBCVENfQ09FWElTVAkJYnRjb2V4aXN0CgkpCnsKCXUxQnl0ZQl3aWZpX3Jzc2lfc3RhdGU7Cgl1NEJ5dGUJd2lmaV9idzsKCgl3aWZpX3Jzc2lfc3RhdGUgPSBoYWxidGM4ODEyYTFhbnRfV2lmaVJzc2lTdGF0ZShidGNvZXhpc3QsIDAsIDIsIDI1LCAwKTsKCgloYWxidGM4ODEyYTFhbnRfRndEYWNTd2luZ0x2bChidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCA0KTsKCglpZihoYWxidGM4ODEyYTFhbnRfTmVlZFRvRGVjQnRQd3IoYnRjb2V4aXN0KSkKCQloYWxidGM4ODEyYTFhbnRfRGVjQnRQd3IoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSk7CgllbHNlCQoJCWhhbGJ0Yzg4MTJhMWFudF9EZWNCdFB3cihidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCBmYWxzZSk7CgkKCWJ0Y29leGlzdC0+YnRjX2dldChidGNvZXhpc3QsIEJUQ19HRVRfVTRfV0lGSV9CVywgJndpZmlfYncpOwoKCWlmKEJUQ19XSUZJX0JXX0hUNDAgPT0gd2lmaV9idykKCXsKCQkvLyBzdyBtZWNoYW5pc20KCQlpZiggKHdpZmlfcnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9ISUdIKSB8fAoJCQkod2lmaV9yc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfSElHSCkgKQoJCXsKCQkJICBoYWxidGM4ODEyYTFhbnRfU3dNZWNoYW5pc20yKGJ0Y29leGlzdCx0cnVlLHRydWUsZmFsc2UsMHgxOCk7CgkJfQoJCWVsc2UKCQl7CgkJCSAgaGFsYnRjODgxMmExYW50X1N3TWVjaGFuaXNtMihidGNvZXhpc3QsZmFsc2UsdHJ1ZSxmYWxzZSwweDE4KTsKCQl9Cgl9CgllbHNlCgl7CgkJLy8gc3cgbWVjaGFuaXNtCgkJaWYoICh3aWZpX3Jzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfSElHSCkgfHwKCQkJKHdpZmlfcnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0gpICkKCQl7CgkJCWhhbGJ0Yzg4MTJhMWFudF9Td01lY2hhbmlzbTIoYnRjb2V4aXN0LHRydWUsdHJ1ZSxmYWxzZSwweDE4KTsKCQl9CgkJZWxzZQoJCXsKCQkJaGFsYnRjODgxMmExYW50X1N3TWVjaGFuaXNtMihidGNvZXhpc3QsZmFsc2UsZmFsc2UsZmFsc2UsMHgxOCk7CgkJfQkJCgl9Cn0KCgp2b2lkCmhhbGJ0Yzg4MTJhMWFudF9BY3Rpb25IaWQoCgkgCVBCVENfQ09FWElTVAkJYnRjb2V4aXN0CgkpCnsKCXUxQnl0ZQl3aWZpX3Jzc2lfc3RhdGUsIGJ0X3Jzc2lfc3RhdGU7CQoJdTRCeXRlCXdpZmlfYnc7CgoJd2lmaV9yc3NpX3N0YXRlID0gaGFsYnRjODgxMmExYW50X1dpZmlSc3NpU3RhdGUoYnRjb2V4aXN0LCAwLCAyLCAyNSwgMCk7CglidF9yc3NpX3N0YXRlID0gaGFsYnRjODgxMmExYW50X0J0UnNzaVN0YXRlKDIsIDUwLCAwKTsKCgloYWxidGM4ODEyYTFhbnRfRndEYWNTd2luZ0x2bChidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCA2KTsKCglpZihoYWxidGM4ODEyYTFhbnRfTmVlZFRvRGVjQnRQd3IoYnRjb2V4aXN0KSkKCQloYWxidGM4ODEyYTFhbnRfRGVjQnRQd3IoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSk7CgllbHNlCQoJCWhhbGJ0Yzg4MTJhMWFudF9EZWNCdFB3cihidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCBmYWxzZSk7CgoJYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwgQlRDX0dFVF9VNF9XSUZJX0JXLCAmd2lmaV9idyk7CgoJaWYoQlRDX1dJRklfQldfSFQ0MCA9PSB3aWZpX2J3KQoJewoJCS8vIHN3IG1lY2hhbmlzbQoJCWlmKCAod2lmaV9yc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX0hJR0gpIHx8CgkJCSh3aWZpX3Jzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSApCgkJewoJCQloYWxidGM4ODEyYTFhbnRfU3dNZWNoYW5pc20yKGJ0Y29leGlzdCx0cnVlLGZhbHNlLGZhbHNlLDB4MTgpOwoJCX0KCQllbHNlCgkJewoJCQloYWxidGM4ODEyYTFhbnRfU3dNZWNoYW5pc20yKGJ0Y29leGlzdCxmYWxzZSxmYWxzZSxmYWxzZSwweDE4KTsKCQl9Cgl9CgllbHNlCgl7CgkJLy8gc3cgbWVjaGFuaXNtCgkJaWYoICh3aWZpX3Jzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfSElHSCkgfHwKCQkJKHdpZmlfcnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0gpICkKCQl7CgkJCWhhbGJ0Yzg4MTJhMWFudF9Td01lY2hhbmlzbTIoYnRjb2V4aXN0LHRydWUsdHJ1ZSxmYWxzZSwweDE4KTsKCQl9CgkJZWxzZQoJCXsKCQkJaGFsYnRjODgxMmExYW50X1N3TWVjaGFuaXNtMihidGNvZXhpc3QsZmFsc2UsZmFsc2UsZmFsc2UsMHgxOCk7CgkJfQkJCgl9Cn0KCi8vQTJEUCBvbmx5IC8gUEFOKEVEUikgb25seS8gQTJEUCtQQU4oSFMpCnZvaWQKaGFsYnRjODgxMmExYW50X0FjdGlvbkEyZHAoCgkgCVBCVENfQ09FWElTVAkJYnRjb2V4aXN0CgkpCnsKCXUxQnl0ZQkJd2lmaV9yc3NpX3N0YXRlLCBidF9yc3NpX3N0YXRlOwoJdTRCeXRlCQl3aWZpX2J3OwoKCXdpZmlfcnNzaV9zdGF0ZSA9IGhhbGJ0Yzg4MTJhMWFudF9XaWZpUnNzaVN0YXRlKGJ0Y29leGlzdCwgMCwgMiwgMjUsIDApOwoJYnRfcnNzaV9zdGF0ZSA9IGhhbGJ0Yzg4MTJhMWFudF9CdFJzc2lTdGF0ZSgyLCA1MCwgMCk7CgoJaGFsYnRjODgxMmExYW50X0Z3RGFjU3dpbmdMdmwoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgNik7CgoJaWYoaGFsYnRjODgxMmExYW50X05lZWRUb0RlY0J0UHdyKGJ0Y29leGlzdCkpCgkJaGFsYnRjODgxMmExYW50X0RlY0J0UHdyKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUpOwoJZWxzZQkKCQloYWxidGM4ODEyYTFhbnRfRGVjQnRQd3IoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgZmFsc2UpOwoKCWJ0Y29leGlzdC0+YnRjX2dldChidGNvZXhpc3QsIEJUQ19HRVRfVTRfV0lGSV9CVywgJndpZmlfYncpOwoKCWlmKEJUQ19XSUZJX0JXX0hUNDAgPT0gd2lmaV9idykKCXsKCQkvLyBzdyBtZWNoYW5pc20KCQlpZiggKHdpZmlfcnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9ISUdIKSB8fAoJCQkod2lmaV9yc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfSElHSCkgKQoJCXsKCQkJaGFsYnRjODgxMmExYW50X1N3TWVjaGFuaXNtMihidGNvZXhpc3QsdHJ1ZSx0cnVlLGZhbHNlLDB4MTgpOwoJCX0KCQllbHNlCgkJewoJCQloYWxidGM4ODEyYTFhbnRfU3dNZWNoYW5pc20yKGJ0Y29leGlzdCxmYWxzZSx0cnVlLGZhbHNlLDB4MTgpOwoJCX0KCX0KCWVsc2UKCXsKCQkvLyBzdyBtZWNoYW5pc20KCQlpZiggKHdpZmlfcnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9ISUdIKSB8fAoJCQkod2lmaV9yc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfSElHSCkgKQoJCXsKCQkJaGFsYnRjODgxMmExYW50X1N3TWVjaGFuaXNtMihidGNvZXhpc3QsdHJ1ZSx0cnVlLGZhbHNlLDB4MTgpOwoJCX0KCQllbHNlCgkJewoJCQloYWxidGM4ODEyYTFhbnRfU3dNZWNoYW5pc20yKGJ0Y29leGlzdCxmYWxzZSxmYWxzZSxmYWxzZSwweDE4KTsKCQl9CQkKCX0KfQoKdm9pZApoYWxidGM4ODEyYTFhbnRfQWN0aW9uQTJkcFBhbkhzKAoJIAlQQlRDX0NPRVhJU1QJCWJ0Y29leGlzdAoJKQp7Cgl1MUJ5dGUJCXdpZmlfcnNzaV9zdGF0ZSwgYnRfcnNzaV9zdGF0ZSwgYnRfaW5mb19leHQ7Cgl1NEJ5dGUJCXdpZmlfYnc7CgoJYnRfaW5mb19leHQgPSBjb2V4X3N0YS0+YnRfaW5mb19leHQ7Cgl3aWZpX3Jzc2lfc3RhdGUgPSBoYWxidGM4ODEyYTFhbnRfV2lmaVJzc2lTdGF0ZShidGNvZXhpc3QsIDAsIDIsIDI1LCAwKTsKCWJ0X3Jzc2lfc3RhdGUgPSBoYWxidGM4ODEyYTFhbnRfQnRSc3NpU3RhdGUoMiwgNTAsIDApOwoKCWhhbGJ0Yzg4MTJhMWFudF9Gd0RhY1N3aW5nTHZsKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDYpOwoKCWlmKGhhbGJ0Yzg4MTJhMWFudF9OZWVkVG9EZWNCdFB3cihidGNvZXhpc3QpKQoJCWhhbGJ0Yzg4MTJhMWFudF9EZWNCdFB3cihidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlKTsKCWVsc2UJCgkJaGFsYnRjODgxMmExYW50X0RlY0J0UHdyKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIGZhbHNlKTsKCglidGNvZXhpc3QtPmJ0Y19nZXQoYnRjb2V4aXN0LCBCVENfR0VUX1U0X1dJRklfQlcsICZ3aWZpX2J3KTsKCglpZihCVENfV0lGSV9CV19IVDQwID09IHdpZmlfYncpCgl7CgkJLy8gc3cgbWVjaGFuaXNtCgkJaWYoICh3aWZpX3Jzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfSElHSCkgfHwKCQkJKHdpZmlfcnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0gpICkKCQl7CgkJCWhhbGJ0Yzg4MTJhMWFudF9Td01lY2hhbmlzbTIoYnRjb2V4aXN0LHRydWUsdHJ1ZSxmYWxzZSwweDE4KTsKCQl9CgkJZWxzZQoJCXsKCQkJaGFsYnRjODgxMmExYW50X1N3TWVjaGFuaXNtMihidGNvZXhpc3QsZmFsc2UsdHJ1ZSxmYWxzZSwweDE4KTsKCQl9Cgl9CgllbHNlCgl7CgkJLy8gc3cgbWVjaGFuaXNtCgkJaWYoICh3aWZpX3Jzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfSElHSCkgfHwKCQkJKHdpZmlfcnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0gpICkKCQl7CgkJCWhhbGJ0Yzg4MTJhMWFudF9Td01lY2hhbmlzbTIoYnRjb2V4aXN0LHRydWUsdHJ1ZSxmYWxzZSwweDE4KTsKCQl9CgkJZWxzZQoJCXsKCQkJaGFsYnRjODgxMmExYW50X1N3TWVjaGFuaXNtMihidGNvZXhpc3QsZmFsc2UsZmFsc2UsZmFsc2UsMHgxOCk7CgkJfQkJCgl9Cn0KCnZvaWQKaGFsYnRjODgxMmExYW50X0FjdGlvblBhbkVkcigKCSAJUEJUQ19DT0VYSVNUCQlidGNvZXhpc3QKCSkKewoJdTFCeXRlCQl3aWZpX3Jzc2lfc3RhdGUsIGJ0X3Jzc2lfc3RhdGU7Cgl1NEJ5dGUJCXdpZmlfYnc7CgoJd2lmaV9yc3NpX3N0YXRlID0gaGFsYnRjODgxMmExYW50X1dpZmlSc3NpU3RhdGUoYnRjb2V4aXN0LCAwLCAyLCAyNSwgMCk7CglidF9yc3NpX3N0YXRlID0gaGFsYnRjODgxMmExYW50X0J0UnNzaVN0YXRlKDIsIDUwLCAwKTsKCgloYWxidGM4ODEyYTFhbnRfRndEYWNTd2luZ0x2bChidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCA2KTsKCglpZihoYWxidGM4ODEyYTFhbnRfTmVlZFRvRGVjQnRQd3IoYnRjb2V4aXN0KSkKCQloYWxidGM4ODEyYTFhbnRfRGVjQnRQd3IoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSk7CgllbHNlCQoJCWhhbGJ0Yzg4MTJhMWFudF9EZWNCdFB3cihidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCBmYWxzZSk7CgoJYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwgQlRDX0dFVF9VNF9XSUZJX0JXLCAmd2lmaV9idyk7CgoJaWYoQlRDX1dJRklfQldfSFQ0MCA9PSB3aWZpX2J3KQoJewoJCS8vIHN3IG1lY2hhbmlzbQoJCWlmKCAod2lmaV9yc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX0hJR0gpIHx8CgkJCSh3aWZpX3Jzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSApCgkJewoJCQloYWxidGM4ODEyYTFhbnRfU3dNZWNoYW5pc20yKGJ0Y29leGlzdCx0cnVlLHRydWUsZmFsc2UsMHgxOCk7CgkJfQoJCWVsc2UKCQl7CgkJCWhhbGJ0Yzg4MTJhMWFudF9Td01lY2hhbmlzbTIoYnRjb2V4aXN0LGZhbHNlLHRydWUsZmFsc2UsMHgxOCk7CgkJfQoJfQoJZWxzZQoJewoJCS8vIHN3IG1lY2hhbmlzbQoJCWlmKCAod2lmaV9yc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX0hJR0gpIHx8CgkJCSh3aWZpX3Jzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSApCgkJewoJCQloYWxidGM4ODEyYTFhbnRfU3dNZWNoYW5pc20yKGJ0Y29leGlzdCx0cnVlLHRydWUsZmFsc2UsMHgxOCk7CgkJfQoJCWVsc2UKCQl7CgkJCWhhbGJ0Yzg4MTJhMWFudF9Td01lY2hhbmlzbTIoYnRjb2V4aXN0LGZhbHNlLGZhbHNlLGZhbHNlLDB4MTgpOwoJCX0KCX0KfQoKCi8vUEFOKEhTKSBvbmx5CnZvaWQKaGFsYnRjODgxMmExYW50X0FjdGlvblBhbkhzKAoJIAlQQlRDX0NPRVhJU1QJCWJ0Y29leGlzdAoJKQp7Cgl1MUJ5dGUJCXdpZmlfcnNzaV9zdGF0ZSwgYnRfcnNzaV9zdGF0ZTsKCXU0Qnl0ZQkJd2lmaV9idzsKCgl3aWZpX3Jzc2lfc3RhdGUgPSBoYWxidGM4ODEyYTFhbnRfV2lmaVJzc2lTdGF0ZShidGNvZXhpc3QsIDAsIDIsIDI1LCAwKTsKCWJ0X3Jzc2lfc3RhdGUgPSBoYWxidGM4ODEyYTFhbnRfQnRSc3NpU3RhdGUoMiwgNTAsIDApOwoKCWhhbGJ0Yzg4MTJhMWFudF9Gd0RhY1N3aW5nTHZsKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDYpOwoKCWJ0Y29leGlzdC0+YnRjX2dldChidGNvZXhpc3QsIEJUQ19HRVRfVTRfV0lGSV9CVywgJndpZmlfYncpOwoKCWlmKEJUQ19XSUZJX0JXX0hUNDAgPT0gd2lmaV9idykKCXsKCQkvLyBmdyBtZWNoYW5pc20KCQlpZiggKHdpZmlfcnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9ISUdIKSB8fAoJCQkod2lmaV9yc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfSElHSCkgKQoJCXsKCQkJaGFsYnRjODgxMmExYW50X0RlY0J0UHdyKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUpOwoJCX0KCQllbHNlCgkJewoJCQloYWxidGM4ODEyYTFhbnRfRGVjQnRQd3IoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgZmFsc2UpOwoJCX0KCgkJLy8gc3cgbWVjaGFuaXNtCgkJaWYoICh3aWZpX3Jzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfSElHSCkgfHwKCQkJKHdpZmlfcnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0gpICkKCQl7CgkJCWhhbGJ0Yzg4MTJhMWFudF9Td01lY2hhbmlzbTIoYnRjb2V4aXN0LHRydWUsdHJ1ZSxmYWxzZSwweDE4KTsKCQl9CgkJZWxzZQoJCXsKCQkJaGFsYnRjODgxMmExYW50X1N3TWVjaGFuaXNtMihidGNvZXhpc3QsZmFsc2UsdHJ1ZSxmYWxzZSwweDE4KTsKCQl9Cgl9CgllbHNlCgl7CgkJLy8gZncgbWVjaGFuaXNtCgkJaWYoICh3aWZpX3Jzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfSElHSCkgfHwKCQkJKHdpZmlfcnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0gpICkKCQl7CgkJCWhhbGJ0Yzg4MTJhMWFudF9EZWNCdFB3cihidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlKTsKCQl9CgkJZWxzZQoJCXsKCQkJaGFsYnRjODgxMmExYW50X0RlY0J0UHdyKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIGZhbHNlKTsKCQl9CgoJCS8vIHN3IG1lY2hhbmlzbQoJCWlmKCAod2lmaV9yc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX0hJR0gpIHx8CgkJCSh3aWZpX3Jzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSApCgkJewoJCQloYWxidGM4ODEyYTFhbnRfU3dNZWNoYW5pc20yKGJ0Y29leGlzdCx0cnVlLHRydWUsZmFsc2UsMHgxOCk7CgkJfQoJCWVsc2UKCQl7CgkJCWhhbGJ0Yzg4MTJhMWFudF9Td01lY2hhbmlzbTIoYnRjb2V4aXN0LGZhbHNlLGZhbHNlLGZhbHNlLDB4MTgpOwoJCX0KCX0KfQoKLy9QQU4oRURSKStBMkRQCnZvaWQKaGFsYnRjODgxMmExYW50X0FjdGlvblBhbkVkckEyZHAoCgkgCVBCVENfQ09FWElTVAkJYnRjb2V4aXN0CgkpCnsKCXUxQnl0ZQkJd2lmaV9yc3NpX3N0YXRlLCBidF9yc3NpX3N0YXRlLCBidF9pbmZvX2V4dDsKCXU0Qnl0ZQkJd2lmaV9idzsKCglidF9pbmZvX2V4dCA9IGNvZXhfc3RhLT5idF9pbmZvX2V4dDsKCXdpZmlfcnNzaV9zdGF0ZSA9IGhhbGJ0Yzg4MTJhMWFudF9XaWZpUnNzaVN0YXRlKGJ0Y29leGlzdCwgMCwgMiwgMjUsIDApOwoJYnRfcnNzaV9zdGF0ZSA9IGhhbGJ0Yzg4MTJhMWFudF9CdFJzc2lTdGF0ZSgyLCA1MCwgMCk7CgoJaGFsYnRjODgxMmExYW50X0Z3RGFjU3dpbmdMdmwoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgNik7CgoJaWYoaGFsYnRjODgxMmExYW50X05lZWRUb0RlY0J0UHdyKGJ0Y29leGlzdCkpCgkJaGFsYnRjODgxMmExYW50X0RlY0J0UHdyKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUpOwoJZWxzZQkKCQloYWxidGM4ODEyYTFhbnRfRGVjQnRQd3IoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgZmFsc2UpOwoKCWJ0Y29leGlzdC0+YnRjX2dldChidGNvZXhpc3QsIEJUQ19HRVRfVTRfV0lGSV9CVywgJndpZmlfYncpOwoKCWlmKEJUQ19XSUZJX0JXX0hUNDAgPT0gd2lmaV9idykKCXsKCQkvLyBzdyBtZWNoYW5pc20KCQlpZiggKHdpZmlfcnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9ISUdIKSB8fAoJCQkod2lmaV9yc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfSElHSCkgKQoJCXsKCQkJaGFsYnRjODgxMmExYW50X1N3TWVjaGFuaXNtMihidGNvZXhpc3QsdHJ1ZSx0cnVlLGZhbHNlLDB4MTgpOwoJCX0KCQllbHNlCgkJewoJCQloYWxidGM4ODEyYTFhbnRfU3dNZWNoYW5pc20yKGJ0Y29leGlzdCxmYWxzZSx0cnVlLGZhbHNlLDB4MTgpOwoJCX0KCX0KCWVsc2UKCXsKCQkvLyBzdyBtZWNoYW5pc20KCQlpZiggKHdpZmlfcnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9ISUdIKSB8fAoJCQkod2lmaV9yc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfSElHSCkgKQoJCXsKCQkJaGFsYnRjODgxMmExYW50X1N3TWVjaGFuaXNtMihidGNvZXhpc3QsdHJ1ZSx0cnVlLGZhbHNlLDB4MTgpOwoJCX0KCQllbHNlCgkJewoJCQloYWxidGM4ODEyYTFhbnRfU3dNZWNoYW5pc20yKGJ0Y29leGlzdCxmYWxzZSxmYWxzZSxmYWxzZSwweDE4KTsKCQl9Cgl9Cn0KCnZvaWQKaGFsYnRjODgxMmExYW50X0FjdGlvblBhbkVkckhpZCgKCSAJUEJUQ19DT0VYSVNUCQlidGNvZXhpc3QKCSkKewoJdTFCeXRlCQl3aWZpX3Jzc2lfc3RhdGUsIGJ0X3Jzc2lfc3RhdGU7Cgl1NEJ5dGUJCXdpZmlfYnc7CgoJd2lmaV9yc3NpX3N0YXRlID0gaGFsYnRjODgxMmExYW50X1dpZmlSc3NpU3RhdGUoYnRjb2V4aXN0LCAwLCAyLCAyNSwgMCk7CglidF9yc3NpX3N0YXRlID0gaGFsYnRjODgxMmExYW50X0J0UnNzaVN0YXRlKDIsIDUwLCAwKTsKCgloYWxidGM4ODEyYTFhbnRfRndEYWNTd2luZ0x2bChidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCA2KTsKCglpZihoYWxidGM4ODEyYTFhbnRfTmVlZFRvRGVjQnRQd3IoYnRjb2V4aXN0KSkKCQloYWxidGM4ODEyYTFhbnRfRGVjQnRQd3IoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSk7CgllbHNlCQoJCWhhbGJ0Yzg4MTJhMWFudF9EZWNCdFB3cihidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCBmYWxzZSk7CgoJYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwgQlRDX0dFVF9VNF9XSUZJX0JXLCAmd2lmaV9idyk7CgoJaWYoQlRDX1dJRklfQldfSFQ0MCA9PSB3aWZpX2J3KQoJewoJCS8vIHN3IG1lY2hhbmlzbQoJCWlmKCAod2lmaV9yc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX0hJR0gpIHx8CgkJCSh3aWZpX3Jzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSApCgkJewoJCQloYWxidGM4ODEyYTFhbnRfU3dNZWNoYW5pc20yKGJ0Y29leGlzdCx0cnVlLHRydWUsZmFsc2UsMHgxOCk7CgkJfQoJCWVsc2UKCQl7CgkJCWhhbGJ0Yzg4MTJhMWFudF9Td01lY2hhbmlzbTIoYnRjb2V4aXN0LGZhbHNlLHRydWUsZmFsc2UsMHgxOCk7CgkJfQoJfQoJZWxzZQoJewkJCgkJLy8gc3cgbWVjaGFuaXNtCgkJaWYoICh3aWZpX3Jzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfSElHSCkgfHwKCQkJKHdpZmlfcnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0gpICkKCQl7CgkJCWhhbGJ0Yzg4MTJhMWFudF9Td01lY2hhbmlzbTIoYnRjb2V4aXN0LHRydWUsdHJ1ZSxmYWxzZSwweDE4KTsKCQl9CgkJZWxzZQoJCXsKCQkJaGFsYnRjODgxMmExYW50X1N3TWVjaGFuaXNtMihidGNvZXhpc3QsZmFsc2UsZmFsc2UsZmFsc2UsMHgxOCk7CgkJfQoJfQp9CgovLyBISUQrQTJEUCtQQU4oRURSKQp2b2lkCmhhbGJ0Yzg4MTJhMWFudF9BY3Rpb25IaWRBMmRwUGFuRWRyKAoJIAlQQlRDX0NPRVhJU1QJCWJ0Y29leGlzdAoJKQp7Cgl1MUJ5dGUJCXdpZmlfcnNzaV9zdGF0ZSwgYnRfcnNzaV9zdGF0ZSwgYnRfaW5mb19leHQ7Cgl1NEJ5dGUJCXdpZmlfYnc7CgoJYnRfaW5mb19leHQgPSBjb2V4X3N0YS0+YnRfaW5mb19leHQ7Cgl3aWZpX3Jzc2lfc3RhdGUgPSBoYWxidGM4ODEyYTFhbnRfV2lmaVJzc2lTdGF0ZShidGNvZXhpc3QsIDAsIDIsIDI1LCAwKTsKCWJ0X3Jzc2lfc3RhdGUgPSBoYWxidGM4ODEyYTFhbnRfQnRSc3NpU3RhdGUoMiwgNTAsIDApOwoKCWhhbGJ0Yzg4MTJhMWFudF9Gd0RhY1N3aW5nTHZsKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDYpOwoKCWlmKGhhbGJ0Yzg4MTJhMWFudF9OZWVkVG9EZWNCdFB3cihidGNvZXhpc3QpKQoJCWhhbGJ0Yzg4MTJhMWFudF9EZWNCdFB3cihidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlKTsKCWVsc2UJCgkJaGFsYnRjODgxMmExYW50X0RlY0J0UHdyKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIGZhbHNlKTsKCglidGNvZXhpc3QtPmJ0Y19nZXQoYnRjb2V4aXN0LCBCVENfR0VUX1U0X1dJRklfQlcsICZ3aWZpX2J3KTsKCglpZihCVENfV0lGSV9CV19IVDQwID09IHdpZmlfYncpCgl7CQoJCS8vIHN3IG1lY2hhbmlzbQoJCWlmKCAod2lmaV9yc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX0hJR0gpIHx8CgkJCSh3aWZpX3Jzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSApCgkJewoJCQloYWxidGM4ODEyYTFhbnRfU3dNZWNoYW5pc20yKGJ0Y29leGlzdCx0cnVlLHRydWUsZmFsc2UsMHgxOCk7CgkJfQoJCWVsc2UKCQl7CgkJCWhhbGJ0Yzg4MTJhMWFudF9Td01lY2hhbmlzbTIoYnRjb2V4aXN0LGZhbHNlLHRydWUsZmFsc2UsMHgxOCk7CgkJfQoJfQoJZWxzZQoJewoJCS8vIHN3IG1lY2hhbmlzbQoJCWlmKCAod2lmaV9yc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX0hJR0gpIHx8CgkJCSh3aWZpX3Jzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSApCgkJewoJCQloYWxidGM4ODEyYTFhbnRfU3dNZWNoYW5pc20yKGJ0Y29leGlzdCx0cnVlLHRydWUsZmFsc2UsMHgxOCk7CgkJfQoJCWVsc2UKCQl7CgkJCWhhbGJ0Yzg4MTJhMWFudF9Td01lY2hhbmlzbTIoYnRjb2V4aXN0LGZhbHNlLGZhbHNlLGZhbHNlLDB4MTgpOwoJCX0KCX0KfQoKdm9pZApoYWxidGM4ODEyYTFhbnRfQWN0aW9uSGlkQTJkcCgKCSAJUEJUQ19DT0VYSVNUCQlidGNvZXhpc3QKCSkKewoJdTFCeXRlCQl3aWZpX3Jzc2lfc3RhdGUsIGJ0X3Jzc2lfc3RhdGUsIGJ0X2luZm9fZXh0OwoJdTRCeXRlCQl3aWZpX2J3OwoKCWJ0X2luZm9fZXh0ID0gY29leF9zdGEtPmJ0X2luZm9fZXh0OwoJd2lmaV9yc3NpX3N0YXRlID0gaGFsYnRjODgxMmExYW50X1dpZmlSc3NpU3RhdGUoYnRjb2V4aXN0LCAwLCAyLCAyNSwgMCk7CglidF9yc3NpX3N0YXRlID0gaGFsYnRjODgxMmExYW50X0J0UnNzaVN0YXRlKDIsIDUwLCAwKTsKCglpZihoYWxidGM4ODEyYTFhbnRfTmVlZFRvRGVjQnRQd3IoYnRjb2V4aXN0KSkKCQloYWxidGM4ODEyYTFhbnRfRGVjQnRQd3IoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSk7CgllbHNlCQoJCWhhbGJ0Yzg4MTJhMWFudF9EZWNCdFB3cihidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCBmYWxzZSk7CgoJYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwgQlRDX0dFVF9VNF9XSUZJX0JXLCAmd2lmaV9idyk7CgoJaWYoQlRDX1dJRklfQldfSFQ0MCA9PSB3aWZpX2J3KQoJewkJCgkJLy8gc3cgbWVjaGFuaXNtCgkJaWYoICh3aWZpX3Jzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfSElHSCkgfHwKCQkJKHdpZmlfcnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0gpICkKCQl7CgkJCWhhbGJ0Yzg4MTJhMWFudF9Td01lY2hhbmlzbTIoYnRjb2V4aXN0LHRydWUsdHJ1ZSxmYWxzZSwweDE4KTsKCQl9CgkJZWxzZQoJCXsKCQkJaGFsYnRjODgxMmExYW50X1N3TWVjaGFuaXNtMihidGNvZXhpc3QsZmFsc2UsdHJ1ZSxmYWxzZSwweDE4KTsKCQl9Cgl9CgllbHNlCgl7CgkJLy8gc3cgbWVjaGFuaXNtCgkJaWYoICh3aWZpX3Jzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfSElHSCkgfHwKCQkJKHdpZmlfcnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0gpICkKCQl7CgkJCWhhbGJ0Yzg4MTJhMWFudF9Td01lY2hhbmlzbTIoYnRjb2V4aXN0LHRydWUsdHJ1ZSxmYWxzZSwweDE4KTsKCQl9CgkJZWxzZQoJCXsKCQkJaGFsYnRjODgxMmExYW50X1N3TWVjaGFuaXNtMihidGNvZXhpc3QsZmFsc2UsZmFsc2UsZmFsc2UsMHgxOCk7CgkJfQoJfQp9Cgp2b2lkCmhhbGJ0Yzg4MTJhMWFudF9BY3Rpb25IcygKCSAJUEJUQ19DT0VYSVNUCQlidGNvZXhpc3QsCgkgCUJPT0xFQU4JCQloc19jb25uZWN0aW5nCgkpCnsKCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgQWN0aW9uIGZvciBIUywgaHNfY29ubmVjdGluZz0lZCEhIVxuIiwgaHNfY29ubmVjdGluZykpOwoJaGFsYnRjODgxMmExYW50X1BzVGRtYShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCBmYWxzZSwgOCk7CgoJaWYoaHNfY29ubmVjdGluZykKCXsKCQloYWxidGM4ODEyYTFhbnRfQ29leFRhYmxlKGJ0Y29leGlzdCwgRk9SQ0VfRVhFQywgMHhhYWFhYWFhYSwgMHhhYWFhYWFhYSwgMHhmZmZmLCAweDMpOwoJfQoJZWxzZQoJewoJCWlmKChjb2V4X3N0YS0+aGlnaF9wcmlvcml0eV90eCtjb2V4X3N0YS0+aGlnaF9wcmlvcml0eV9yeCsKCQkJY29leF9zdGEtPmxvd19wcmlvcml0eV90eCtjb2V4X3N0YS0+bG93X3ByaW9yaXR5X3J4KTw9MTIwMCkKCQkJaGFsYnRjODgxMmExYW50X0NvZXhUYWJsZShidGNvZXhpc3QsIEZPUkNFX0VYRUMsIDB4YWFhYWFhYWEsIDB4YWFhYWFhYWEsIDB4ZmZmZiwgMHgzKTsKCQllbHNlCgkJCWhhbGJ0Yzg4MTJhMWFudF9Db2V4VGFibGUoYnRjb2V4aXN0LCBGT1JDRV9FWEVDLCAweGZmZmZmZmZmLCAweGZmZmZmZmZmLCAweGZmZmYsIDB4Myk7CQoJfQp9CgoKdm9pZApoYWxidGM4ODEyYTFhbnRfQWN0aW9uV2lmaU5vdENvbm5lY3RlZCgKCSAJUEJUQ19DT0VYSVNUCQlidGNvZXhpc3QKCSkKewoJQk9PTEVBTgkJaHNfY29ubmVjdGluZz1mYWxzZTsKCglidGNvZXhpc3QtPmJ0Y19nZXQoYnRjb2V4aXN0LCBCVENfR0VUX0JMX0hTX0NPTk5FQ1RJTkcsICZoc19jb25uZWN0aW5nKTsKCQoJaGFsYnRjODgxMmExYW50X1BzVGRtYUNoZWNrRm9yUG93ZXJTYXZlU3RhdGUoYnRjb2V4aXN0LCBmYWxzZSk7CglidGNvZXhpc3QtPmJ0Y19zZXQoYnRjb2V4aXN0LCBCVENfU0VUX0FDVF9MRUFWRV9MUFMsIE5VTEwpOwoKCWlmKGhzX2Nvbm5lY3RpbmcpCgl7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBIUyBpcyBjb25uZWN0aW5nISEhXG4iKSk7CgkJaGFsYnRjODgxMmExYW50X0FjdGlvbkhzKGJ0Y29leGlzdCwgaHNfY29ubmVjdGluZyk7Cgl9CgllbHNlCgl7CgkJaGFsYnRjODgxMmExYW50X1BzVGRtYShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCBmYWxzZSwgOCk7CgkJaGFsYnRjODgxMmExYW50X0NvZXhUYWJsZShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCAweDU1NTU1NTU1LCAweDU1NTU1NTU1LCAweGZmZmYsIDB4Myk7Cgl9Cn0KCnZvaWQKaGFsYnRjODgxMmExYW50X0FjdGlvbldpZmlOb3RDb25uZWN0ZWRBc3NvQXV0aFNjYW4oCgkgCVBCVENfQ09FWElTVAkJYnRjb2V4aXN0CgkpCnsKCVBCVENfU1RBQ0tfSU5GTwlzdGFja19pbmZvPSZidGNvZXhpc3QtPnN0YWNrX2luZm87CglCT09MRUFOCQkJaHNfY29ubmVjdGluZz1mYWxzZTsKCglidGNvZXhpc3QtPmJ0Y19nZXQoYnRjb2V4aXN0LCBCVENfR0VUX0JMX0hTX0NPTk5FQ1RJTkcsICZoc19jb25uZWN0aW5nKTsKCWhhbGJ0Yzg4MTJhMWFudF9Qc1RkbWFDaGVja0ZvclBvd2VyU2F2ZVN0YXRlKGJ0Y29leGlzdCwgZmFsc2UpOwoJYnRjb2V4aXN0LT5idGNfc2V0KGJ0Y29leGlzdCwgQlRDX1NFVF9BQ1RfTEVBVkVfTFBTLCBOVUxMKTsKCglpZihoc19jb25uZWN0aW5nKQoJewoJCWhhbGJ0Yzg4MTJhMWFudF9BY3Rpb25IcyhidGNvZXhpc3QsIGhzX2Nvbm5lY3RpbmcpOwoJfQoJZWxzZSBpZihidGNvZXhpc3QtPmJ0X2luZm8uYnRfZGlzYWJsZWQpCgl7CgkJaGFsYnRjODgxMmExYW50X1BzVGRtYShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCBmYWxzZSwgOSk7CgkJaGFsYnRjODgxMmExYW50X0NvZXhUYWJsZShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCAweDU1NTU1NTU1LCAweDU1NTU1NTU1LCAweGZmZmYsIDB4Myk7Cgl9CgllbHNlIGlmKEJUXzg4MTJBXzFBTlRfQlRfU1RBVFVTX0lOUV9QQUdFID09IGNvZXhfZG0tPmJ0X3N0YXR1cykKewoJCWhhbGJ0Yzg4MTJhMWFudF9Qc1RkbWEoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMzApOwoJCWhhbGJ0Yzg4MTJhMWFudF9Db2V4VGFibGUoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgMHg1NTU1NTU1NSwgMHg1NTU1NTU1NSwgMHhmZmZmLCAweDMpOwoJfQoJZWxzZSBpZiggKEJUXzg4MTJBXzFBTlRfQlRfU1RBVFVTX05PTl9DT05ORUNURURfSURMRSA9PSBjb2V4X2RtLT5idF9zdGF0dXMpIHx8CgkJKEJUXzg4MTJBXzFBTlRfQlRfU1RBVFVTX0NPTk5FQ1RFRF9JRExFID09IGNvZXhfZG0tPmJ0X3N0YXR1cykgKQoJewoJCWhhbGJ0Yzg4MTJhMWFudF9Qc1RkbWEoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMjgpOwoJCWhhbGJ0Yzg4MTJhMWFudF9Db2V4VGFibGUoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgMHg1NTU1NTU1NSwgMHg1NTU1NTU1NSwgMHhmZmZmLCAweDMpOwoJfQoJZWxzZSBpZihCVF84ODEyQV8xQU5UX0JUX1NUQVRVU19BQ0xfQlVTWSA9PSBjb2V4X2RtLT5idF9zdGF0dXMpCgl7CgkJaWYoc3RhY2tfaW5mby0+aGlkX2V4aXN0KQoJCQloYWxidGM4ODEyYTFhbnRfUHNUZG1hKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDM1KTsKCQllbHNlCgkJCWhhbGJ0Yzg4MTJhMWFudF9Qc1RkbWEoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMjkpOwoJCWhhbGJ0Yzg4MTJhMWFudF9Db2V4VGFibGUoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgMHg1NTU1NTU1NSwgMHg1YWZhNWFmYSwgMHhmZmZmLCAweDMpOwoJfQoJZWxzZSBpZiggKEJUXzg4MTJBXzFBTlRfQlRfU1RBVFVTX1NDT19CVVNZID09IGNvZXhfZG0tPmJ0X3N0YXR1cykgfHwKCQkoQlRfODgxMkFfMUFOVF9CVF9TVEFUVVNfQUNMX1NDT19CVVNZID09IGNvZXhfZG0tPmJ0X3N0YXR1cykgKQoJCXsKCQloYWxidGM4ODEyYTFhbnRfUHNUZG1hKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIGZhbHNlLCA4KTsKCQloYWxidGM4ODEyYTFhbnRfQ29leFRhYmxlKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDB4NWFlYTVhZWEsIDB4NWFlYTVhZWEsIDB4ZmZmZiwgMHgzKTsKCX0KCWVsc2UgCgl7CgkJLy9lcnJvciBjb25kaXRpb24sIHNob3VsZCBub3QgcmVhY2ggaGVyZSwgcmVjb3JkIGVycm9yIG51bWJlciBmb3IgZGVidWdnaW5nLgoJCWNvZXhfZG0tPmVycm9yX2NvbmRpdGlvbiA9IDE7Cgl9Cn0KCnZvaWQKaGFsYnRjODgxMmExYW50X0FjdGlvbldpZmlDb25uZWN0ZWRTY2FuKAoJIAlQQlRDX0NPRVhJU1QJCWJ0Y29leGlzdAoJKQp7CglQQlRDX1NUQUNLX0lORk8Jc3RhY2tfaW5mbz0mYnRjb2V4aXN0LT5zdGFja19pbmZvOwoJCglCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIEFjdGlvbkNvbm5lY3RlZFNjYW4oKT09PT5cbiIpKTsKCglpZihidGNvZXhpc3QtPmJ0X2luZm8uYnRfZGlzYWJsZWQpCgl7CgkJaGFsYnRjODgxMmExYW50X1BzVGRtYUNoZWNrRm9yUG93ZXJTYXZlU3RhdGUoYnRjb2V4aXN0LCBmYWxzZSk7CgkJYnRjb2V4aXN0LT5idGNfc2V0KGJ0Y29leGlzdCwgQlRDX1NFVF9BQ1RfTEVBVkVfTFBTLCBOVUxMKTsKCQloYWxidGM4ODEyYTFhbnRfUHNUZG1hKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIGZhbHNlLCA5KTsKCQloYWxidGM4ODEyYTFhbnRfQ29leFRhYmxlKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDB4NTU1NTU1NTUsIDB4NTU1NTU1NTUsIDB4ZmZmZiwgMHgzKTsKCX0KCWVsc2UKCXsKCQloYWxidGM4ODEyYTFhbnRfUHNUZG1hQ2hlY2tGb3JQb3dlclNhdmVTdGF0ZShidGNvZXhpc3QsIHRydWUpOwoJCWhhbGJ0Yzg4MTJhMWFudF9McHNScHdtKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDB4MCwgMHg0KTsKCQkvLyBwb3dlciBzYXZlIG11c3QgZXhlY3V0ZWQgYmVmb3JlIHBzVGRtYS4KCQlidGNvZXhpc3QtPmJ0Y19zZXQoYnRjb2V4aXN0LCBCVENfU0VUX0FDVF9FTlRFUl9MUFMsIE5VTEwpOwoKCQkvLyBwc1RkbWEKCQlpZihCVF84ODEyQV8xQU5UX0JUX1NUQVRVU19JTlFfUEFHRSA9PSBjb2V4X2RtLT5idF9zdGF0dXMpCgkJewoJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIEFjdGlvbkNvbm5lY3RlZFNjYW4oKSwgYnQgaXMgdW5kZXIgaW5xdWlyeS9wYWdlIHNjYW5cbiIpKTsKCQkJaWYoc3RhY2tfaW5mby0+c2NvX2V4aXN0KQoJCQl7CgkJCQloYWxidGM4ODEyYTFhbnRfUHNUZG1hKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDMyKTsKCQkJCWhhbGJ0Yzg4MTJhMWFudF9Db2V4VGFibGUoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgMHg1NTU1NTU1NSwgMHg1YWZhNWFmYSwgMHhmZmZmLCAweDMpOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJaGFsYnRjODgxMmExYW50X1BzVGRtYShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAzMCk7CgkJCQloYWxidGM4ODEyYTFhbnRfQ29leFRhYmxlKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDB4NTU1NTU1NTUsIDB4NTU1NTU1NTUsIDB4ZmZmZiwgMHgzKTsKCQkJfQoJCX0KCQllbHNlIGlmKCAoQlRfODgxMkFfMUFOVF9CVF9TVEFUVVNfTk9OX0NPTk5FQ1RFRF9JRExFID09IGNvZXhfZG0tPmJ0X3N0YXR1cykgfHwKCQkJKEJUXzg4MTJBXzFBTlRfQlRfU1RBVFVTX0NPTk5FQ1RFRF9JRExFID09IGNvZXhfZG0tPmJ0X3N0YXR1cykgKQoJCXsKCQkJaGFsYnRjODgxMmExYW50X1BzVGRtYShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCA1KTsKCQkJaGFsYnRjODgxMmExYW50X0NvZXhUYWJsZShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCAweDU1NTU1NTU1LCAweDU1NTU1NTU1LCAweGZmZmYsIDB4Myk7CgkJfQoJCWVsc2UgaWYoQlRfODgxMkFfMUFOVF9CVF9TVEFUVVNfQUNMX0JVU1kgPT0gY29leF9kbS0+YnRfc3RhdHVzKQoJCXsKCQkJaWYoc3RhY2tfaW5mby0+aGlkX2V4aXN0KQoJCXsKCQkJCWhhbGJ0Yzg4MTJhMWFudF9Qc1RkbWEoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMzQpOwoJCQkJaGFsYnRjODgxMmExYW50X0NvZXhUYWJsZShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCAweDU1NTU1NTU1LCAweDVhZmE1YWZhLCAweGZmZmYsIDB4Myk7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQloYWxidGM4ODEyYTFhbnRfUHNUZG1hKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDQpOwoJCQkJaGFsYnRjODgxMmExYW50X0NvZXhUYWJsZShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCAweDU1NTU1NTU1LCAweDU1NTU1NTU1LCAweGZmZmYsIDB4Myk7CgkJCX0KCQl9CgkJZWxzZSBpZiggKEJUXzg4MTJBXzFBTlRfQlRfU1RBVFVTX1NDT19CVVNZID09IGNvZXhfZG0tPmJ0X3N0YXR1cykgfHwKCQkJKEJUXzg4MTJBXzFBTlRfQlRfU1RBVFVTX0FDTF9TQ09fQlVTWSA9PSBjb2V4X2RtLT5idF9zdGF0dXMpICkKCQl7CgkJCWhhbGJ0Yzg4MTJhMWFudF9Qc1RkbWEoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMzMpOwoJCQloYWxidGM4ODEyYTFhbnRfQ29leFRhYmxlKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDB4NTU1NTU1NTUsIDB4NWFmYTVhZmEsIDB4ZmZmZiwgMHgzKTsKCQl9CgkJZWxzZSAKCQl7CgkJCS8vZXJyb3IgY29uZGl0aW9uLCBzaG91bGQgbm90IHJlYWNoIGhlcmUKCQkJY29leF9kbS0+ZXJyb3JfY29uZGl0aW9uID0gMjsKCQl9Cgl9CglCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIEFjdGlvbkNvbm5lY3RlZFNjYW4oKTw9PT1cbiIpKTsKfQoKdm9pZApoYWxidGM4ODEyYTFhbnRfQWN0aW9uV2lmaUNvbm5lY3RlZFNwZWNpYWxQYWNrZXQoCgkgCVBCVENfQ09FWElTVAkJYnRjb2V4aXN0CgkpCnsKCVBCVENfU1RBQ0tfSU5GTwlzdGFja19pbmZvPSZidGNvZXhpc3QtPnN0YWNrX2luZm87CgoJaGFsYnRjODgxMmExYW50X1BzVGRtYUNoZWNrRm9yUG93ZXJTYXZlU3RhdGUoYnRjb2V4aXN0LCBmYWxzZSk7CglidGNvZXhpc3QtPmJ0Y19zZXQoYnRjb2V4aXN0LCBCVENfU0VUX0FDVF9MRUFWRV9MUFMsIE5VTEwpOwoKCWlmKGJ0Y29leGlzdC0+YnRfaW5mby5idF9kaXNhYmxlZCkKCXsJCgkJaGFsYnRjODgxMmExYW50X1BzVGRtYShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCBmYWxzZSwgOSk7CgkJaGFsYnRjODgxMmExYW50X0NvZXhUYWJsZShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCAweDU1NTU1NTU1LCAweDU1NTU1NTU1LCAweGZmZmYsIDB4Myk7Cgl9CgllbHNlCgl7CgkJaWYoQlRfODgxMkFfMUFOVF9CVF9TVEFUVVNfSU5RX1BBR0UgPT0gY29leF9kbS0+YnRfc3RhdHVzKQoJCXsKCQkJaWYoc3RhY2tfaW5mby0+c2NvX2V4aXN0KQoJCXsKCQkJCWhhbGJ0Yzg4MTJhMWFudF9Qc1RkbWEoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMzIpOwoJCQkJaGFsYnRjODgxMmExYW50X0NvZXhUYWJsZShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCAweDU1NTU1NTU1LCAweDVhZmE1YWZhLCAweGZmZmYsIDB4Myk7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQloYWxidGM4ODEyYTFhbnRfUHNUZG1hKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDMwKTsKCQkJCWhhbGJ0Yzg4MTJhMWFudF9Db2V4VGFibGUoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgMHg1NTU1NTU1NSwgMHg1NTU1NTU1NSwgMHhmZmZmLCAweDMpOwoJCQl9CgkJfQoJCWVsc2UgaWYoIChCVF84ODEyQV8xQU5UX0JUX1NUQVRVU19OT05fQ09OTkVDVEVEX0lETEUgPT0gY29leF9kbS0+YnRfc3RhdHVzKSB8fAoJCQkoQlRfODgxMkFfMUFOVF9CVF9TVEFUVVNfQ09OTkVDVEVEX0lETEUgPT0gY29leF9kbS0+YnRfc3RhdHVzKSApCgkJewoJCQloYWxidGM4ODEyYTFhbnRfUHNUZG1hKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDI4KTsKCQkJaGFsYnRjODgxMmExYW50X0NvZXhUYWJsZShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCAweDU1NTU1NTU1LCAweDU1NTU1NTU1LCAweGZmZmYsIDB4Myk7CgkJfQoJCWVsc2UgaWYoQlRfODgxMkFfMUFOVF9CVF9TVEFUVVNfQUNMX0JVU1kgPT0gY29leF9kbS0+YnRfc3RhdHVzKQoJCXsKCQkJaWYoc3RhY2tfaW5mby0+aGlkX2V4aXN0KQoJCQkJaGFsYnRjODgxMmExYW50X1BzVGRtYShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAzNSk7CgkJCWVsc2UKCQkJCWhhbGJ0Yzg4MTJhMWFudF9Qc1RkbWEoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMjkpOwoJCQloYWxidGM4ODEyYTFhbnRfQ29leFRhYmxlKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDB4NTU1NTU1NTUsIDB4NWFmYTVhZmEsIDB4ZmZmZiwgMHgzKTsKCQl9CgkJZWxzZSBpZiggKEJUXzg4MTJBXzFBTlRfQlRfU1RBVFVTX1NDT19CVVNZID09IGNvZXhfZG0tPmJ0X3N0YXR1cykgfHwKCQkJKEJUXzg4MTJBXzFBTlRfQlRfU1RBVFVTX0FDTF9TQ09fQlVTWSA9PSBjb2V4X2RtLT5idF9zdGF0dXMpICkKCQl7CgkJCWhhbGJ0Yzg4MTJhMWFudF9Qc1RkbWEoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgZmFsc2UsIDgpOwoJCQloYWxidGM4ODEyYTFhbnRfQ29leFRhYmxlKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDB4NWFlYTVhZWEsIDB4NWFlYTVhZWEsIDB4ZmZmZiwgMHgzKTsKCQl9CgkJZWxzZSAKCQl7CgkJCS8vZXJyb3IgY29uZGl0aW9uLCBzaG91bGQgbm90IHJlYWNoIGhlcmUKCQkJY29leF9kbS0+ZXJyb3JfY29uZGl0aW9uID0gMzsKCQl9Cgl9Cn0KCnZvaWQKaGFsYnRjODgxMmExYW50X0FjdGlvbldpZmlDb25uZWN0ZWQoCgkgCVBCVENfQ09FWElTVAkJYnRjb2V4aXN0CgkpCnsKCVBCVENfU1RBQ0tfSU5GTwlzdGFja19pbmZvPSZidGNvZXhpc3QtPnN0YWNrX2luZm87CglCT09MRUFOIAl3aWZpX2Nvbm5lY3RlZD1mYWxzZSwgd2lmaV9idXN5PWZhbHNlLCBidF9oc19vbj1mYWxzZTsKCUJPT0xFQU4JCXNjYW49ZmFsc2UsIGxpbms9ZmFsc2UsIHJvYW09ZmFsc2U7CglCT09MRUFOCQloc19jb25uZWN0aW5nPWZhbHNlLCB1bmRlcjR3YXk9ZmFsc2U7Cgl1NEJ5dGUJCXdpZmlfYnc7CgoJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBDb2V4Rm9yV2lmaUNvbm5lY3QoKT09PT5cbiIpKTsKCglidGNvZXhpc3QtPmJ0Y19nZXQoYnRjb2V4aXN0LCBCVENfR0VUX0JMX1dJRklfQ09OTkVDVEVELCAmd2lmaV9jb25uZWN0ZWQpOwoJaWYoIXdpZmlfY29ubmVjdGVkKQoJewoJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgQ29leEZvcldpZmlDb25uZWN0KCksIHJldHVybiBmb3Igd2lmaSBub3QgY29ubmVjdGVkPD09PVxuIikpOwoJCXJldHVybjsKCX0KCglidGNvZXhpc3QtPmJ0Y19nZXQoYnRjb2V4aXN0LCBCVENfR0VUX0JMX1dJRklfNF9XQVlfUFJPR1JFU1MsICZ1bmRlcjR3YXkpOwoJaWYodW5kZXI0d2F5KQoJewoJCWhhbGJ0Yzg4MTJhMWFudF9BY3Rpb25XaWZpQ29ubmVjdGVkU3BlY2lhbFBhY2tldChidGNvZXhpc3QpOwoJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgQ29leEZvcldpZmlDb25uZWN0KCksIHJldHVybiBmb3Igd2lmaSBpcyB1bmRlciA0d2F5PD09PVxuIikpOwoJCXJldHVybjsKCX0KCQoJYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwgQlRDX0dFVF9CTF9IU19DT05ORUNUSU5HLCAmaHNfY29ubmVjdGluZyk7CglidGNvZXhpc3QtPmJ0Y19nZXQoYnRjb2V4aXN0LCBCVENfR0VUX0JMX0hTX09QRVJBVElPTiwgJmJ0X2hzX29uKTsKCWJ0Y29leGlzdC0+YnRjX2dldChidGNvZXhpc3QsIEJUQ19HRVRfQkxfV0lGSV9TQ0FOLCAmc2Nhbik7CglidGNvZXhpc3QtPmJ0Y19nZXQoYnRjb2V4aXN0LCBCVENfR0VUX0JMX1dJRklfTElOSywgJmxpbmspOwoJYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwgQlRDX0dFVF9CTF9XSUZJX1JPQU0sICZyb2FtKTsKCWlmKHNjYW4gfHwgbGluayB8fCByb2FtKQoJewoJCWhhbGJ0Yzg4MTJhMWFudF9BY3Rpb25XaWZpQ29ubmVjdGVkU2NhbihidGNvZXhpc3QpOwoJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgQ29leEZvcldpZmlDb25uZWN0KCksIHJldHVybiBmb3Igd2lmaSBpcyB1bmRlciBzY2FuPD09PVxuIikpOwoJCXJldHVybjsKCX0KCQoJYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwgQlRDX0dFVF9CTF9XSUZJX0JVU1ksICZ3aWZpX2J1c3kpOwkKCWlmKCF3aWZpX2J1c3kpCgl7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCB3aWZpIGFzc29jaWF0ZWQtaWRsZSEhIVxuIikpOwoJCWlmKGJ0Y29leGlzdC0+YnRfaW5mby5idF9kaXNhYmxlZCkKCQl7CgkJCWhhbGJ0Yzg4MTJhMWFudF9Qc1RkbWFDaGVja0ZvclBvd2VyU2F2ZVN0YXRlKGJ0Y29leGlzdCwgdHJ1ZSk7CgkJCWhhbGJ0Yzg4MTJhMWFudF9McHNScHdtKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDB4MCwgMHg0KTsKCQkJYnRjb2V4aXN0LT5idGNfc2V0KGJ0Y29leGlzdCwgQlRDX1NFVF9BQ1RfRU5URVJfTFBTLCBOVUxMKTsKCQkJaGFsYnRjODgxMmExYW50X1BzVGRtYShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCBmYWxzZSwgOSk7CgkJCWhhbGJ0Yzg4MTJhMWFudF9Db2V4VGFibGUoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgMHg1NTU1NTU1NSwgMHg1NTU1NTU1NSwgMHhmZmZmLCAweDMpOwoJCX0KCQllbHNlCgkJewoJCQlpZihCVF84ODEyQV8xQU5UX0JUX1NUQVRVU19JTlFfUEFHRSA9PSBjb2V4X2RtLT5idF9zdGF0dXMpCgkJCXsKCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgYnQgaXMgdW5kZXIgaW5xdWlyeS9wYWdlIHNjYW4hISFcbiIpKTsKCQkJCWlmKHN0YWNrX2luZm8tPnNjb19leGlzdCkKCQkJCXsKCQkJCQloYWxidGM4ODEyYTFhbnRfUHNUZG1hKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDMyKTsKCQkJCQloYWxidGM4ODEyYTFhbnRfQ29leFRhYmxlKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDB4NTU1NTU1NTUsIDB4NWFmYTVhZmEsIDB4ZmZmZiwgMHgzKTsKCQkJCX0KCQkJCWVsc2UKCQkJCXsKCQkJCQloYWxidGM4ODEyYTFhbnRfUHNUZG1hQ2hlY2tGb3JQb3dlclNhdmVTdGF0ZShidGNvZXhpc3QsIHRydWUpOwoJCQkJCWhhbGJ0Yzg4MTJhMWFudF9McHNScHdtKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDB4MCwgMHg0KTsKCQkJCQkvLyBwb3dlciBzYXZlIG11c3QgZXhlY3V0ZWQgYmVmb3JlIHBzVGRtYS4KCQkJCQlidGNvZXhpc3QtPmJ0Y19zZXQoYnRjb2V4aXN0LCBCVENfU0VUX0FDVF9FTlRFUl9MUFMsIE5VTEwpOwoJCQkJCWhhbGJ0Yzg4MTJhMWFudF9Qc1RkbWEoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMzApOwoJCQkJCWhhbGJ0Yzg4MTJhMWFudF9Db2V4VGFibGUoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgMHg1NTU1NTU1NSwgMHg1NTU1NTU1NSwgMHhmZmZmLCAweDMpOwoJCQkJfQoJCQl9CgkJCWVsc2UgaWYoQlRfODgxMkFfMUFOVF9CVF9TVEFUVVNfTk9OX0NPTk5FQ1RFRF9JRExFID09IGNvZXhfZG0tPmJ0X3N0YXR1cykKCQkJewoJCQkJaGFsYnRjODgxMmExYW50X1BzVGRtYUNoZWNrRm9yUG93ZXJTYXZlU3RhdGUoYnRjb2V4aXN0LCB0cnVlKTsKCQkJCWhhbGJ0Yzg4MTJhMWFudF9McHNScHdtKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDB4MjYsIDB4MCk7CgkJCQkvLyBwb3dlciBzYXZlIG11c3QgZXhlY3V0ZWQgYmVmb3JlIHBzVGRtYS4KCQkJCWJ0Y29leGlzdC0+YnRjX3NldChidGNvZXhpc3QsIEJUQ19TRVRfQUNUX0VOVEVSX0xQUywgTlVMTCk7CgkJCQloYWxidGM4ODEyYTFhbnRfUHNUZG1hKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIGZhbHNlLCA5KTsKCQkJCWhhbGJ0Yzg4MTJhMWFudF9Db2V4VGFibGUoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgMHg1NTU1NTU1NSwgMHg1NTU1NTU1NSwgMHhmZmZmLCAweDMpOwoJCQl9CgkJCWVsc2UgaWYoQlRfODgxMkFfMUFOVF9CVF9TVEFUVVNfQ09OTkVDVEVEX0lETEUgPT0gY29leF9kbS0+YnRfc3RhdHVzKQoJCQl7CgkJCQloYWxidGM4ODEyYTFhbnRfUHNUZG1hQ2hlY2tGb3JQb3dlclNhdmVTdGF0ZShidGNvZXhpc3QsIHRydWUpOwoJCQkJaGFsYnRjODgxMmExYW50X0xwc1Jwd20oYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgMHgyNiwgMHgwKTsKCQkJCS8vIHBvd2VyIHNhdmUgbXVzdCBleGVjdXRlZCBiZWZvcmUgcHNUZG1hLgoJCQkJYnRjb2V4aXN0LT5idGNfc2V0KGJ0Y29leGlzdCwgQlRDX1NFVF9BQ1RfRU5URVJfTFBTLCBOVUxMKTsKCQkJCWhhbGJ0Yzg4MTJhMWFudF9Qc1RkbWEoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgZmFsc2UsIDApOwoJCQkJaGFsYnRjODgxMmExYW50X0NvZXhUYWJsZShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCAweDU1NTU1NTU1LCAweDU1NTU1NTU1LCAweGZmZmYsIDB4Myk7CgkJCX0KCQkJZWxzZSBpZihCVF84ODEyQV8xQU5UX0JUX1NUQVRVU19BQ0xfQlVTWSA9PSBjb2V4X2RtLT5idF9zdGF0dXMpCgkJCXsKCQkJCWlmKHN0YWNrX2luZm8tPmhpZF9leGlzdCAmJiBzdGFja19pbmZvLT5udW1PZkxpbms9PTEpCgkJCQl7CgkJCQkJLy8gaGlkIG9ubHkKCQkJCQloYWxidGM4ODEyYTFhbnRfUHNUZG1hQ2hlY2tGb3JQb3dlclNhdmVTdGF0ZShidGNvZXhpc3QsIGZhbHNlKTsKCQkJCQkvLyBwb3dlciBzYXZlIG11c3QgZXhlY3V0ZWQgYmVmb3JlIHBzVGRtYS4KCQkJCQlidGNvZXhpc3QtPmJ0Y19zZXQoYnRjb2V4aXN0LCBCVENfU0VUX0FDVF9MRUFWRV9MUFMsIE5VTEwpOwoJCQkJCQoJCQkJCWhhbGJ0Yzg4MTJhMWFudF9Qc1RkbWEoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgZmFsc2UsIDgpOwoJCQkJCWhhbGJ0Yzg4MTJhMWFudF9Db2V4VGFibGUoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgMHg1ZmZmNWZmZiwgMHg1ZmZmNWZmZiwgMHhmZmZmLCAweDMpOwoJCQkJCWNvZXhfZG0tPnJlc2V0X3RkbWFfYWRqdXN0ID0gdHJ1ZTsKCQkJCX0KCQkJCWVsc2UKCQkJCXsJCQkJCgkJCQkJaGFsYnRjODgxMmExYW50X1BzVGRtYUNoZWNrRm9yUG93ZXJTYXZlU3RhdGUoYnRjb2V4aXN0LCB0cnVlKTsKCQkJCQloYWxidGM4ODEyYTFhbnRfTHBzUnB3bShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCAweDAsIDB4NCk7CgkJCQkJLy8gcG93ZXIgc2F2ZSBtdXN0IGV4ZWN1dGVkIGJlZm9yZSBwc1RkbWEuCgkJCQkJYnRjb2V4aXN0LT5idGNfc2V0KGJ0Y29leGlzdCwgQlRDX1NFVF9BQ1RfRU5URVJfTFBTLCBOVUxMKTsKCgkJCQkJaWYoc3RhY2tfaW5mby0+aGlkX2V4aXN0KQoJCQkJCXsKCQkJCQkJaWYoc3RhY2tfaW5mby0+YTJkcF9leGlzdCkKCQkJCQkJewoJCQkJCQkJLy8gaGlkK2EyZHAKCQkJCQkJCWhhbGJ0Yzg4MTJhMWFudF9Qc1RkbWEoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMik7CgkJCQkJCQloYWxidGM4ODEyYTFhbnRfQ29leFRhYmxlKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDB4NTU1NTU1NTUsIDB4NWFmYTVhZmEsIDB4ZmZmZiwgMHgzKTsKCQkJCQkJfQoJCQkJCQllbHNlIGlmKHN0YWNrX2luZm8tPnBhbl9leGlzdCkKCQkJCQkJewoJCQkJCQkJaWYoYnRfaHNfb24pCgkJCQkJCQl7CgkJCQkJCQkJLy8gaGlkK2hzCgkJCQkJCQkJaGFsYnRjODgxMmExYW50X1BzVGRtYShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAyKTsKCQkJCQkJCX0KCQkJCQkJCWVsc2UKCQkJCQkJCXsKCQkJCQkJCQkvLyBoaWQrcGFuCgkJCQkJCQkJaGFsYnRjODgxMmExYW50X1BzVGRtYShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAyKTsKCQkJCQkJCX0KCQkJCQkJCWhhbGJ0Yzg4MTJhMWFudF9Db2V4VGFibGUoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgMHg1NTU1NTU1NSwgMHg1YWZhNWFmYSwgMHhmZmZmLCAweDMpOwoJCQkJCQl9CgkJCQkJCWVsc2UKCQkJCQkJewoJCQkJCQkJY29leF9kbS0+ZXJyb3JfY29uZGl0aW9uID0gNDsKCQkJCQkJfQoJCQkJCQljb2V4X2RtLT5yZXNldF90ZG1hX2FkanVzdCA9IHRydWU7CgkJCQkJfQoJCQkJCWVsc2UgaWYoc3RhY2tfaW5mby0+YTJkcF9leGlzdCkKCQkJCQl7CgkJCQkJCWlmKHN0YWNrX2luZm8tPnBhbl9leGlzdCkKCQkJCQkJewoJCQkJCQkJaWYoYnRfaHNfb24pCgkJCQkJCQl7CgkJCQkJCQkJLy8gYTJkcCtocwoJCQkJCQkJCWhhbGJ0Yzg4MTJhMWFudF9Qc1RkbWEoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMik7CgkJCQkJCQl9CgkJCQkJCQllbHNlCgkJCQkJCQl7CgkJCQkJCQkJLy8gYTJkcCtwYW4KCQkJCQkJCQloYWxidGM4ODEyYTFhbnRfUHNUZG1hKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDM2KTsKCQkJCQkJCX0KCQkJCQkJCWhhbGJ0Yzg4MTJhMWFudF9Db2V4VGFibGUoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgMHg1NTU1NTU1NSwgMHg1YWZhNWFmYSwgMHhmZmZmLCAweDMpOwoJCQkJCQkJY29leF9kbS0+cmVzZXRfdGRtYV9hZGp1c3QgPSB0cnVlOwoJCQkJCQl9CgkJCQkJCWVsc2UKCQkJCQkJewoJCQkJCQkJLy8gYTJkcCBvbmx5CgkJCQkJCQloYWxidGM4ODEyYTFhbnRfVGRtYUR1cmF0aW9uQWRqdXN0Rm9yQWNsKGJ0Y29leGlzdCk7CgkJCQkJCQloYWxidGM4ODEyYTFhbnRfQ29leFRhYmxlKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDB4NTU1NTU1NTUsIDB4NWFmYTVhZmEsIDB4ZmZmZiwgMHgzKTsKCQkJCQkJfQoJCQkJCX0KCQkJCQllbHNlIGlmKHN0YWNrX2luZm8tPnBhbl9leGlzdCkKCQkJCQl7CgkJCQkJCS8vIHBhbiBvbmx5CgkJCQkJCWlmKGJ0X2hzX29uKQoJCQkJCQl7CgkJCQkJCQljb2V4X2RtLT5lcnJvcl9jb25kaXRpb24gPSA1OwoJCQkJCQl9CgkJCQkJCWVsc2UKCQkJCQkJewoJCQkJCQkJaGFsYnRjODgxMmExYW50X1BzVGRtYShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAyKTsKCQkJCQkJCWhhbGJ0Yzg4MTJhMWFudF9Db2V4VGFibGUoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgMHg1NTU1NTU1NSwgMHg1YWZhNWFmYSwgMHhmZmZmLCAweDMpOwoJCQkJCQl9CgkJCQkJCWNvZXhfZG0tPnJlc2V0X3RkbWFfYWRqdXN0ID0gdHJ1ZTsKCQkJCQl9CgkJCQkJZWxzZQoJCQkJCXsKCQkJCQkJLy8gdGVtcCBzdGF0ZSwgZG8gbm90aGluZyEhIQoJCQkJCQkvL0RiZ1ByaW50KCJlcnJvciA2LCBjb2V4X2RtLT5idF9zdGF0dXM9JWRcbiIsIGNvZXhfZG0tPmJ0X3N0YXR1cyk7CgkJCQkJCS8vRGJnUHJpbnQoImVycm9yIDYsIHN0YWNrX2luZm8tPm51bU9mTGluaz0lZCwgc3RhY2tfaW5mby0+aGlkX2V4aXN0PSVkLCBzdGFja19pbmZvLT5hMmRwX2V4aXN0PSVkLCBzdGFja19pbmZvLT5wYW5fZXhpc3Q9JWQsIHN0YWNrX2luZm8tPnNjb19leGlzdD0lZFxuIiwgCgkJCQkJCQkvL3N0YWNrX2luZm8tPm51bU9mTGluaywgc3RhY2tfaW5mby0+aGlkX2V4aXN0LCBzdGFja19pbmZvLT5hMmRwX2V4aXN0LCBzdGFja19pbmZvLT5wYW5fZXhpc3QsIHN0YWNrX2luZm8tPnNjb19leGlzdCk7CgkJCQkJCS8vY29leF9kbS0+ZXJyb3JfY29uZGl0aW9uID0gNjsKCQkJCQl9CgkJCQl9CgkJCX0KCQkJZWxzZSBpZiggKEJUXzg4MTJBXzFBTlRfQlRfU1RBVFVTX1NDT19CVVNZID09IGNvZXhfZG0tPmJ0X3N0YXR1cykgfHwKCQkJCShCVF84ODEyQV8xQU5UX0JUX1NUQVRVU19BQ0xfU0NPX0JVU1kgPT0gY29leF9kbS0+YnRfc3RhdHVzKSApCgkJCXsKCQkJCWhhbGJ0Yzg4MTJhMWFudF9Qc1RkbWFDaGVja0ZvclBvd2VyU2F2ZVN0YXRlKGJ0Y29leGlzdCwgZmFsc2UpOwoJCQkJLy8gcG93ZXIgc2F2ZSBtdXN0IGV4ZWN1dGVkIGJlZm9yZSBwc1RkbWEuCgkJCQlidGNvZXhpc3QtPmJ0Y19zZXQoYnRjb2V4aXN0LCBCVENfU0VUX0FDVF9MRUFWRV9MUFMsIE5VTEwpOwoKCQkJCWhhbGJ0Yzg4MTJhMWFudF9Qc1RkbWEoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgZmFsc2UsIDgpOwoJCQkJaGFsYnRjODgxMmExYW50X0NvZXhUYWJsZShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCAweDVhZWE1YWVhLCAweDVhZWE1YWVhLCAweGZmZmYsIDB4Myk7CgkJCX0KCQkJZWxzZSAKCQkJewoJCQkJLy9lcnJvciBjb25kaXRpb24sIHNob3VsZCBub3QgcmVhY2ggaGVyZQoJCQkJY29leF9kbS0+ZXJyb3JfY29uZGl0aW9uID0gNzsKCQkJfQoJCX0KCX0KCWVsc2UKCXsKCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIHdpZmkgYnVzeSEhIVxuIikpOwoJCWlmKGJ0Y29leGlzdC0+YnRfaW5mby5idF9kaXNhYmxlZCkKCQl7CgkJCWhhbGJ0Yzg4MTJhMWFudF9Qc1RkbWFDaGVja0ZvclBvd2VyU2F2ZVN0YXRlKGJ0Y29leGlzdCwgZmFsc2UpOwoJCQlidGNvZXhpc3QtPmJ0Y19zZXQoYnRjb2V4aXN0LCBCVENfU0VUX0FDVF9MRUFWRV9MUFMsIE5VTEwpOwoJCQloYWxidGM4ODEyYTFhbnRfUHNUZG1hKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIGZhbHNlLCA5KTsKCQkJaGFsYnRjODgxMmExYW50X0NvZXhUYWJsZShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCAweDU1NTU1NTU1LCAweDU1NTU1NTU1LCAweGZmZmYsIDB4Myk7CgkJfQoJCWVsc2UKCQl7CgkJCWlmKGJ0X2hzX29uKQoJCQl7CgkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIEhTIGlzIHVuZGVyIHByb2dyZXNzISEhXG4iKSk7CgkJCQkvL0RiZ1ByaW50KCJjb2V4X2RtLT5idF9zdGF0dXMgPSAweCV4XG4iLCBjb2V4X2RtLT5idF9zdGF0dXMpOwoJCQkJaGFsYnRjODgxMmExYW50X0FjdGlvbkhzKGJ0Y29leGlzdCwgaHNfY29ubmVjdGluZyk7CgkJCX0KCQkJZWxzZSBpZihCVF84ODEyQV8xQU5UX0JUX1NUQVRVU19JTlFfUEFHRSA9PSBjb2V4X2RtLT5idF9zdGF0dXMpCgkJCXsKCQkJCWlmKHN0YWNrX2luZm8tPnNjb19leGlzdCkKCQkJCXsKCQkJCQloYWxidGM4ODEyYTFhbnRfUHNUZG1hKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDMyKTsKCQkJCQloYWxidGM4ODEyYTFhbnRfQ29leFRhYmxlKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDB4NTU1NTU1NTUsIDB4NWFmYTVhZmEsIDB4ZmZmZiwgMHgzKTsKCQkJCX0KCQkJCWVsc2UKCQkJCXsKCQkJCQloYWxidGM4ODEyYTFhbnRfUHNUZG1hQ2hlY2tGb3JQb3dlclNhdmVTdGF0ZShidGNvZXhpc3QsIHRydWUpOwoJCQkJCWhhbGJ0Yzg4MTJhMWFudF9McHNScHdtKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDB4MCwgMHg0KTsKCQkJCQkvLyBwb3dlciBzYXZlIG11c3QgZXhlY3V0ZWQgYmVmb3JlIHBzVGRtYS4KCQkJCQlidGNvZXhpc3QtPmJ0Y19zZXQoYnRjb2V4aXN0LCBCVENfU0VUX0FDVF9FTlRFUl9MUFMsIE5VTEwpOwoJCQkJCWhhbGJ0Yzg4MTJhMWFudF9Qc1RkbWEoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMzApOwoJCQkJCWhhbGJ0Yzg4MTJhMWFudF9Db2V4VGFibGUoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgMHg1NTU1NTU1NSwgMHg1NTU1NTU1NSwgMHhmZmZmLCAweDMpOwoJCQkJfQoJCQl9CgkJCWVsc2UgaWYoQlRfODgxMkFfMUFOVF9CVF9TVEFUVVNfTk9OX0NPTk5FQ1RFRF9JRExFID09IGNvZXhfZG0tPmJ0X3N0YXR1cykKCQkJewoJCQkJaGFsYnRjODgxMmExYW50X1BzVGRtYUNoZWNrRm9yUG93ZXJTYXZlU3RhdGUoYnRjb2V4aXN0LCBmYWxzZSk7CgkJCQkvLyBwb3dlciBzYXZlIG11c3QgZXhlY3V0ZWQgYmVmb3JlIHBzVGRtYS4KCQkJCWJ0Y29leGlzdC0+YnRjX3NldChidGNvZXhpc3QsIEJUQ19TRVRfQUNUX0xFQVZFX0xQUywgTlVMTCk7CgkJCQloYWxidGM4ODEyYTFhbnRfUHNUZG1hKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDUpOwoJCQkJaGFsYnRjODgxMmExYW50X0NvZXhUYWJsZShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCAweDVhNWE1YTVhLCAweDVhNWE1YTVhLCAweGZmZmYsIDB4Myk7CgkJCX0KCQkJZWxzZSBpZihCVF84ODEyQV8xQU5UX0JUX1NUQVRVU19DT05ORUNURURfSURMRSA9PSBjb2V4X2RtLT5idF9zdGF0dXMpCgkJCXsKCQkJCWhhbGJ0Yzg4MTJhMWFudF9Qc1RkbWFDaGVja0ZvclBvd2VyU2F2ZVN0YXRlKGJ0Y29leGlzdCwgZmFsc2UpOwoJCQkJLy8gcG93ZXIgc2F2ZSBtdXN0IGV4ZWN1dGVkIGJlZm9yZSBwc1RkbWEuCgkJCQlidGNvZXhpc3QtPmJ0Y19zZXQoYnRjb2V4aXN0LCBCVENfU0VUX0FDVF9MRUFWRV9MUFMsIE5VTEwpOwoJCQkJaWYoYnRfaHNfb24pCgkJCQl7CgkJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBIUyBpcyB1bmRlciBwcm9ncmVzcyEhIVxuIikpOwoJCQkJCWhhbGJ0Yzg4MTJhMWFudF9BY3Rpb25IcyhidGNvZXhpc3QsIGhzX2Nvbm5lY3RpbmcpOwoJCQkJfQoJCQkJZWxzZQoJCQkJewoJCQkJCWhhbGJ0Yzg4MTJhMWFudF9Qc1RkbWEoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgNSk7CgkJCQkJaGFsYnRjODgxMmExYW50X0NvZXhUYWJsZShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCAweDVhNWE1YTVhLCAweDVhNWE1YTVhLCAweGZmZmYsIDB4Myk7CgkJCQl9CgkJCX0KCQkJZWxzZSBpZihCVF84ODEyQV8xQU5UX0JUX1NUQVRVU19BQ0xfQlVTWSA9PSBjb2V4X2RtLT5idF9zdGF0dXMpCgkJCXsKCQkJCWlmKHN0YWNrX2luZm8tPmhpZF9leGlzdCAmJiBzdGFja19pbmZvLT5udW1PZkxpbms9PTEpCgkJCQl7CgkJCQkJLy8gaGlkIG9ubHkKCQkJCQloYWxidGM4ODEyYTFhbnRfUHNUZG1hQ2hlY2tGb3JQb3dlclNhdmVTdGF0ZShidGNvZXhpc3QsIGZhbHNlKTsKCQkJCQkvLyBwb3dlciBzYXZlIG11c3QgZXhlY3V0ZWQgYmVmb3JlIHBzVGRtYS4KCQkJCQlidGNvZXhpc3QtPmJ0Y19zZXQoYnRjb2V4aXN0LCBCVENfU0VUX0FDVF9MRUFWRV9MUFMsIE5VTEwpOwoJCQkJCQoJCQkJCWhhbGJ0Yzg4MTJhMWFudF9Qc1RkbWEoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgZmFsc2UsIDgpOwoJCQkJCWhhbGJ0Yzg4MTJhMWFudF9Db2V4VGFibGUoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgMHg1ZmZmNWZmZiwgMHg1ZmZmNWZmZiwgMHhmZmZmLCAweDMpOwoJCQkJCWNvZXhfZG0tPnJlc2V0X3RkbWFfYWRqdXN0ID0gdHJ1ZTsKCQkJCX0KCQkJCWVsc2UKCQkJCXsKCQkJCQloYWxidGM4ODEyYTFhbnRfUHNUZG1hQ2hlY2tGb3JQb3dlclNhdmVTdGF0ZShidGNvZXhpc3QsIHRydWUpOwoJCQkJCWhhbGJ0Yzg4MTJhMWFudF9McHNScHdtKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDB4MCwgMHg0KTsKCQkJCQkvLyBwb3dlciBzYXZlIG11c3QgZXhlY3V0ZWQgYmVmb3JlIHBzVGRtYS4KCQkJCQlidGNvZXhpc3QtPmJ0Y19zZXQoYnRjb2V4aXN0LCBCVENfU0VUX0FDVF9FTlRFUl9MUFMsIE5VTEwpOwoKCQkJCQlpZihzdGFja19pbmZvLT5oaWRfZXhpc3QpCgkJCQkJewoJCQkJCQlpZihzdGFja19pbmZvLT5hMmRwX2V4aXN0KQoJCQkJCQl7CgkJCQkJCQkvLyBoaWQrYTJkcAoJCQkJCQkJaGFsYnRjODgxMmExYW50X1BzVGRtYShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAyKTsKCQkJCQkJCWhhbGJ0Yzg4MTJhMWFudF9Db2V4VGFibGUoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgMHg1NTU1NTU1NSwgMHg1YWZhNWFmYSwgMHhmZmZmLCAweDMpOwoJCQkJCQl9CgkJCQkJCWVsc2UgaWYoc3RhY2tfaW5mby0+cGFuX2V4aXN0KQoJCQkJCQl7CgkJCQkJCQlpZihidF9oc19vbikKCQkJCQkJCXsKCQkJCQkJCQkvLyBoaWQraHMKCQkJCQkJCQloYWxidGM4ODEyYTFhbnRfUHNUZG1hKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDIpOwoJCQkJCQkJfQoJCQkJCQkJZWxzZQoJCQkJCQkJewoJCQkJCQkJCS8vIGhpZCtwYW4KCQkJCQkJCQloYWxidGM4ODEyYTFhbnRfUHNUZG1hKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDIpOwoJCQkJCQkJfQoJCQkJCQkJaGFsYnRjODgxMmExYW50X0NvZXhUYWJsZShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCAweDU1NTU1NTU1LCAweDVhZmE1YWZhLCAweGZmZmYsIDB4Myk7CgkJCQkJCX0KCQkJCQkJZWxzZQoJCQkJCQl7CgkJCQkJCQljb2V4X2RtLT5lcnJvcl9jb25kaXRpb24gPSA4OwoJCQkJCQl9CgkJCQkJCWNvZXhfZG0tPnJlc2V0X3RkbWFfYWRqdXN0ID0gdHJ1ZTsKCQkJCQl9CgkJCQkJZWxzZSBpZihzdGFja19pbmZvLT5hMmRwX2V4aXN0KQoJCQkJCXsKCQkJCQkJaWYoc3RhY2tfaW5mby0+cGFuX2V4aXN0KQoJCQkJCQl7CgkJCQkJCQlpZihidF9oc19vbikKCQkJCQkJCXsKCQkJCQkJCQkvLyBhMmRwK2hzCgkJCQkJCQkJaGFsYnRjODgxMmExYW50X1BzVGRtYShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAyKTsKCQkJCQkJCX0KCQkJCQkJCWVsc2UKCQkJCQkJCXsKCQkJCQkJCQkvLyBhMmRwK3BhbgoJCQkJCQkJCWhhbGJ0Yzg4MTJhMWFudF9Qc1RkbWEoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMzYpOwoJCQkJCQkJfQoJCQkJCQkJaGFsYnRjODgxMmExYW50X0NvZXhUYWJsZShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCAweDU1NTU1NTU1LCAweDVhZmE1YWZhLCAweGZmZmYsIDB4Myk7CgkJCQkJCQljb2V4X2RtLT5yZXNldF90ZG1hX2FkanVzdCA9IHRydWU7CgkJCQkJCX0KCQkJCQkJZWxzZQoJCQkJCQl7CgkJCQkJCQkvLyBhMmRwIG9ubHkKCQkJCQkJCWhhbGJ0Yzg4MTJhMWFudF9UZG1hRHVyYXRpb25BZGp1c3RGb3JBY2woYnRjb2V4aXN0KTsKCQkJCQkJCWhhbGJ0Yzg4MTJhMWFudF9Db2V4VGFibGUoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgMHg1NTU1NTU1NSwgMHg1YWZhNWFmYSwgMHhmZmZmLCAweDMpOwoJCQkJCQl9CgkJCQkJfQoJCQkJCWVsc2UgaWYoc3RhY2tfaW5mby0+cGFuX2V4aXN0KQoJCQkJCXsKCQkJCQkJLy8gcGFuIG9ubHkKCQkJCQkJaWYoYnRfaHNfb24pCgkJCQkJCXsKCQkJCQkJCWNvZXhfZG0tPmVycm9yX2NvbmRpdGlvbiA9IDk7CgkJCQkJCX0KCQkJCQkJZWxzZQoJCQkJCQl7CgkJCQkJCQloYWxidGM4ODEyYTFhbnRfUHNUZG1hKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDIpOwoJCQkJCQkJaGFsYnRjODgxMmExYW50X0NvZXhUYWJsZShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCAweDU1NTU1NTU1LCAweDVhZmE1YWZhLCAweGZmZmYsIDB4Myk7CgkJCQkJCX0KCQkJCQkJY29leF9kbS0+cmVzZXRfdGRtYV9hZGp1c3QgPSB0cnVlOwoJCQkJCX0KCQkJCQllbHNlCgkJCQkJewoJCQkJCQkvL0RiZ1ByaW50KCJlcnJvciAxMCwgc3RhY2tfaW5mby0+bnVtT2ZMaW5rPSVkLCBzdGFja19pbmZvLT5oaWRfZXhpc3Q9JWQsIHN0YWNrX2luZm8tPmEyZHBfZXhpc3Q9JWQsIHN0YWNrX2luZm8tPnBhbl9leGlzdD0lZCwgc3RhY2tfaW5mby0+c2NvX2V4aXN0PSVkXG4iLCAKCQkJCQkJCS8vc3RhY2tfaW5mby0+bnVtT2ZMaW5rLCBzdGFja19pbmZvLT5oaWRfZXhpc3QsIHN0YWNrX2luZm8tPmEyZHBfZXhpc3QsIHN0YWNrX2luZm8tPnBhbl9leGlzdCwgc3RhY2tfaW5mby0+c2NvX2V4aXN0KTsKCQkJCQkJY29leF9kbS0+ZXJyb3JfY29uZGl0aW9uID0gMTA7CgkJCQkJfQoJCQkJfQoJCQl9CgkJCWVsc2UgaWYoIChCVF84ODEyQV8xQU5UX0JUX1NUQVRVU19TQ09fQlVTWSA9PSBjb2V4X2RtLT5idF9zdGF0dXMpIHx8CgkJCQkoQlRfODgxMkFfMUFOVF9CVF9TVEFUVVNfQUNMX1NDT19CVVNZID09IGNvZXhfZG0tPmJ0X3N0YXR1cykgKQoJCQl7CgkJCQloYWxidGM4ODEyYTFhbnRfUHNUZG1hQ2hlY2tGb3JQb3dlclNhdmVTdGF0ZShidGNvZXhpc3QsIGZhbHNlKTsKCQkJCS8vIHBvd2VyIHNhdmUgbXVzdCBleGVjdXRlZCBiZWZvcmUgcHNUZG1hLgoJCQkJYnRjb2V4aXN0LT5idGNfc2V0KGJ0Y29leGlzdCwgQlRDX1NFVF9BQ1RfTEVBVkVfTFBTLCBOVUxMKTsKCgkJCQloYWxidGM4ODEyYTFhbnRfUHNUZG1hKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIGZhbHNlLCA4KTsKCQkJCWhhbGJ0Yzg4MTJhMWFudF9Db2V4VGFibGUoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgMHg1YWVhNWFlYSwgMHg1YWVhNWFlYSwgMHhmZmZmLCAweDMpOwoJCQl9CgkJCWVsc2UgCgkJCXsKCQkJCS8vRGJnUHJpbnQoImVycm9yIDExLCBjb2V4X2RtLT5idF9zdGF0dXM9JWRcbiIsIGNvZXhfZG0tPmJ0X3N0YXR1cyk7CgkJCQkvL0RiZ1ByaW50KCJlcnJvciAxMSwgc3RhY2tfaW5mby0+bnVtT2ZMaW5rPSVkLCBzdGFja19pbmZvLT5oaWRfZXhpc3Q9JWQsIHN0YWNrX2luZm8tPmEyZHBfZXhpc3Q9JWQsIHN0YWNrX2luZm8tPnBhbl9leGlzdD0lZCwgc3RhY2tfaW5mby0+c2NvX2V4aXN0PSVkXG4iLCAKCQkJCQkvL3N0YWNrX2luZm8tPm51bU9mTGluaywgc3RhY2tfaW5mby0+aGlkX2V4aXN0LCBzdGFja19pbmZvLT5hMmRwX2V4aXN0LCBzdGFja19pbmZvLT5wYW5fZXhpc3QsIHN0YWNrX2luZm8tPnNjb19leGlzdCk7CgkJCQkvL2Vycm9yIGNvbmRpdGlvbiwgc2hvdWxkIG5vdCByZWFjaCBoZXJlCgkJCQljb2V4X2RtLT5lcnJvcl9jb25kaXRpb24gPSAxMTsKCQkJfQoJCX0KCX0KCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgQ29leEZvcldpZmlDb25uZWN0KCk8PT09XG4iKSk7Cn0KCnZvaWQKaGFsYnRjODgxMmExYW50X1J1blN3Q29leGlzdE1lY2hhbmlzbSgKCSAJUEJUQ19DT0VYSVNUCQlidGNvZXhpc3QKCSkKewoJUEJUQ19TVEFDS19JTkZPCQlzdGFja19pbmZvPSZidGNvZXhpc3QtPnN0YWNrX2luZm87CglCT09MRUFOCQkJCXdpZmlfdW5kZXI1Zz1mYWxzZSwgd2lmaV9idXN5PWZhbHNlLCB3aWZpX2Nvbm5lY3RlZD1mYWxzZTsKCXUxQnl0ZQkJCQlidF9pbmZvX29yaWdpbmFsPTAsIGJ0X3JldHJ5X2NudD0wOwoJdTFCeXRlCQkJCWFsZ29yaXRobT0wOwoKCXJldHVybjsKCWlmKHN0YWNrX2luZm8tPmJQcm9maWxlTm90aWZpZWQpCgl7CgkJYWxnb3JpdGhtID0gaGFsYnRjODgxMmExYW50X0FjdGlvbkFsZ29yaXRobShidGNvZXhpc3QpOwoJCWNvZXhfZG0tPmN1cl9hbGdvcml0aG0gPSBhbGdvcml0aG07CQkKCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIEFsZ29yaXRobSA9ICVkIFxuIiwgY29leF9kbS0+Y3VyX2FsZ29yaXRobSkpOwoKCQlpZihoYWxidGM4ODEyYTFhbnRfSXNDb21tb25BY3Rpb24oYnRjb2V4aXN0KSkKCQl7CgkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgQWN0aW9uIGNvbW1vbi5cbiIpKTsKCQl9CgkJZWxzZQoJCXsKCQkJc3dpdGNoKGNvZXhfZG0tPmN1cl9hbGdvcml0aG0pCgkJCXsKCQkJCWNhc2UgQlRfODgxMkFfMUFOVF9DT0VYX0FMR09fU0NPOgoJCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgQWN0aW9uIGFsZ29yaXRobSA9IFNDTy5cbiIpKTsKCQkJCQloYWxidGM4ODEyYTFhbnRfQWN0aW9uU2NvKGJ0Y29leGlzdCk7CgkJCQkJYnJlYWs7CgkJCQljYXNlIEJUXzg4MTJBXzFBTlRfQ09FWF9BTEdPX0hJRDoKCQkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIEFjdGlvbiBhbGdvcml0aG0gPSBISUQuXG4iKSk7CgkJCQkJaGFsYnRjODgxMmExYW50X0FjdGlvbkhpZChidGNvZXhpc3QpOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSBCVF84ODEyQV8xQU5UX0NPRVhfQUxHT19BMkRQOgoJCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgQWN0aW9uIGFsZ29yaXRobSA9IEEyRFAuXG4iKSk7CgkJCQkJaGFsYnRjODgxMmExYW50X0FjdGlvbkEyZHAoYnRjb2V4aXN0KTsKCQkJCQlicmVhazsKCQkJCWNhc2UgQlRfODgxMkFfMUFOVF9DT0VYX0FMR09fQTJEUF9QQU5IUzoKCQkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIEFjdGlvbiBhbGdvcml0aG0gPSBBMkRQK1BBTihIUykuXG4iKSk7CgkJCQkJaGFsYnRjODgxMmExYW50X0FjdGlvbkEyZHBQYW5IcyhidGNvZXhpc3QpOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSBCVF84ODEyQV8xQU5UX0NPRVhfQUxHT19QQU5FRFI6CgkJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBBY3Rpb24gYWxnb3JpdGhtID0gUEFOKEVEUikuXG4iKSk7CgkJCQkJaGFsYnRjODgxMmExYW50X0FjdGlvblBhbkVkcihidGNvZXhpc3QpOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSBCVF84ODEyQV8xQU5UX0NPRVhfQUxHT19QQU5IUzoKCQkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIEFjdGlvbiBhbGdvcml0aG0gPSBIUyBtb2RlLlxuIikpOwoJCQkJCWhhbGJ0Yzg4MTJhMWFudF9BY3Rpb25QYW5IcyhidGNvZXhpc3QpOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSBCVF84ODEyQV8xQU5UX0NPRVhfQUxHT19QQU5FRFJfQTJEUDoKCQkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIEFjdGlvbiBhbGdvcml0aG0gPSBQQU4rQTJEUC5cbiIpKTsKCQkJCQloYWxidGM4ODEyYTFhbnRfQWN0aW9uUGFuRWRyQTJkcChidGNvZXhpc3QpOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSBCVF84ODEyQV8xQU5UX0NPRVhfQUxHT19QQU5FRFJfSElEOgoJCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgQWN0aW9uIGFsZ29yaXRobSA9IFBBTihFRFIpK0hJRC5cbiIpKTsKCQkJCQloYWxidGM4ODEyYTFhbnRfQWN0aW9uUGFuRWRySGlkKGJ0Y29leGlzdCk7CgkJCQkJYnJlYWs7CgkJCQljYXNlIEJUXzg4MTJBXzFBTlRfQ09FWF9BTEdPX0hJRF9BMkRQX1BBTkVEUjoKCQkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIEFjdGlvbiBhbGdvcml0aG0gPSBISUQrQTJEUCtQQU4uXG4iKSk7CgkJCQkJaGFsYnRjODgxMmExYW50X0FjdGlvbkhpZEEyZHBQYW5FZHIoYnRjb2V4aXN0KTsKCQkJCQlicmVhazsKCQkJCWNhc2UgQlRfODgxMkFfMUFOVF9DT0VYX0FMR09fSElEX0EyRFA6CgkJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBBY3Rpb24gYWxnb3JpdGhtID0gSElEK0EyRFAuXG4iKSk7CgkJCQkJaGFsYnRjODgxMmExYW50X0FjdGlvbkhpZEEyZHAoYnRjb2V4aXN0KTsKCQkJCQlicmVhazsKCQkJCWRlZmF1bHQ6CgkJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBBY3Rpb24gYWxnb3JpdGhtID0gY29leGlzdCBBbGwgT2ZmISFcbiIpKTsKCQkJCQloYWxidGM4ODEyYTFhbnRfQ29leEFsbE9mZihidGNvZXhpc3QpOwoJCQkJCWJyZWFrOwoJCQl9CgkJCWNvZXhfZG0tPnByZV9hbGdvcml0aG0gPSBjb2V4X2RtLT5jdXJfYWxnb3JpdGhtOwoJCX0KCX0KfQoKdm9pZApoYWxidGM4ODEyYTFhbnRfUnVuQ29leGlzdE1lY2hhbmlzbSgKCSAJUEJUQ19DT0VYSVNUCQlidGNvZXhpc3QKCSkKewoJUEJUQ19TVEFDS19JTkZPCQlzdGFja19pbmZvPSZidGNvZXhpc3QtPnN0YWNrX2luZm87CglCT09MRUFOCQkJCXdpZmlfdW5kZXI1Zz1mYWxzZSwgd2lmaV9idXN5PWZhbHNlLCB3aWZpX2Nvbm5lY3RlZD1mYWxzZTsKCglCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIFJ1bkNvZXhpc3RNZWNoYW5pc20oKT09PT5cbiIpKTsKCglidGNvZXhpc3QtPmJ0Y19nZXQoYnRjb2V4aXN0LCBCVENfR0VUX0JMX1dJRklfVU5ERVJfNUcsICZ3aWZpX3VuZGVyNWcpOwoKCWlmKHdpZmlfdW5kZXI1ZykKCXsKCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIFJ1bkNvZXhpc3RNZWNoYW5pc20oKSwgcmV0dXJuIGZvciA1RyA8PT09XG4iKSk7CgkJcmV0dXJuOwoJfQoKCWlmKGJ0Y29leGlzdC0+bWFudWFsX2NvbnRyb2wpCgl7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBSdW5Db2V4aXN0TWVjaGFuaXNtKCksIHJldHVybiBmb3IgTWFudWFsIENUUkwgPD09PVxuIikpOwoJCXJldHVybjsKCX0KCglpZihidGNvZXhpc3QtPnN0b3BfY29leF9kbSkKCXsKCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIFJ1bkNvZXhpc3RNZWNoYW5pc20oKSwgcmV0dXJuIGZvciBTdG9wIENvZXggRE0gPD09PVxuIikpOwoJCXJldHVybjsKCX0KCgloYWxidGM4ODEyYTFhbnRfUnVuU3dDb2V4aXN0TWVjaGFuaXNtKGJ0Y29leGlzdCk7CgoJYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwgQlRDX0dFVF9CTF9XSUZJX0NPTk5FQ1RFRCwgJndpZmlfY29ubmVjdGVkKTsKCWlmKGJ0Y29leGlzdC0+YnRfaW5mby5idF9kaXNhYmxlZCkKCXsKCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIGJ0IGlzIGRpc2FibGVkISEhXG4iKSk7CgkJYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwgQlRDX0dFVF9CTF9XSUZJX0JVU1ksICZ3aWZpX2J1c3kpOwoJCWlmKHdpZmlfYnVzeSkKCQl7CQkJCgkJCWhhbGJ0Yzg4MTJhMWFudF9Qc1RkbWFDaGVja0ZvclBvd2VyU2F2ZVN0YXRlKGJ0Y29leGlzdCwgZmFsc2UpOwoJCQlidGNvZXhpc3QtPmJ0Y19zZXQoYnRjb2V4aXN0LCBCVENfU0VUX0FDVF9MRUFWRV9MUFMsIE5VTEwpOwoJCQloYWxidGM4ODEyYTFhbnRfUHNUZG1hKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIGZhbHNlLCA5KTsKCQl9CgkJZWxzZQoJCXsKCQkJaGFsYnRjODgxMmExYW50X1BzVGRtYUNoZWNrRm9yUG93ZXJTYXZlU3RhdGUoYnRjb2V4aXN0LCB0cnVlKTsKCQkJaGFsYnRjODgxMmExYW50X0xwc1Jwd20oYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgMHgwLCAweDQpOwoJCQkvLyBwb3dlciBzYXZlIG11c3QgZXhlY3V0ZWQgYmVmb3JlIHBzVGRtYS4KCQkJYnRjb2V4aXN0LT5idGNfc2V0KGJ0Y29leGlzdCwgQlRDX1NFVF9BQ1RfRU5URVJfTFBTLCBOVUxMKTsKCQkJaGFsYnRjODgxMmExYW50X1BzVGRtYShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCBmYWxzZSwgOSk7CgkJfQoJCWhhbGJ0Yzg4MTJhMWFudF9Db2V4VGFibGUoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgMHg1NTU1NTU1NSwgMHg1NTU1NTU1NSwgMHhmZmZmLCAweDMpOwoJfQoJZWxzZSBpZihjb2V4X3N0YS0+dW5kZXJfaXBzKQoJewoJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgd2lmaSBpcyB1bmRlciBJUFMgISEhXG4iKSk7CgkJaGFsYnRjODgxMmExYW50X1BzVGRtYShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCBmYWxzZSwgMCk7CgkJaGFsYnRjODgxMmExYW50X0NvZXhUYWJsZShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCAweDU1NTU1NTU1LCAweDU1NTU1NTU1LCAweGZmZmYsIDB4Myk7CgkJaGFsYnRjODgxMmExYW50X1dpZmlQYXJhQWRqdXN0KGJ0Y29leGlzdCwgZmFsc2UpOwoJfQoJZWxzZSBpZighd2lmaV9jb25uZWN0ZWQpCgl7CgkJQk9PTEVBTglzY2FuPWZhbHNlLCBsaW5rPWZhbHNlLCByb2FtPWZhbHNlOwoJCQoJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgd2lmaSBpcyBub24gY29ubmVjdGVkLWlkbGUgISEhXG4iKSk7CgoJCWJ0Y29leGlzdC0+YnRjX2dldChidGNvZXhpc3QsIEJUQ19HRVRfQkxfV0lGSV9TQ0FOLCAmc2Nhbik7CgkJYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwgQlRDX0dFVF9CTF9XSUZJX0xJTkssICZsaW5rKTsKCQlidGNvZXhpc3QtPmJ0Y19nZXQoYnRjb2V4aXN0LCBCVENfR0VUX0JMX1dJRklfUk9BTSwgJnJvYW0pOwoKCQlpZihzY2FuIHx8IGxpbmsgfHwgcm9hbSkKCQkJaGFsYnRjODgxMmExYW50X0FjdGlvbldpZmlOb3RDb25uZWN0ZWRBc3NvQXV0aFNjYW4oYnRjb2V4aXN0KTsKCQllbHNlCgkJCWhhbGJ0Yzg4MTJhMWFudF9BY3Rpb25XaWZpTm90Q29ubmVjdGVkKGJ0Y29leGlzdCk7Cgl9CgllbHNlCS8vIHdpZmkgTFBTL0J1c3kKCXsKCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIHdpZmkgaXMgTk9UIHVuZGVyIElQUyEhIVxuIikpOwoJCWhhbGJ0Yzg4MTJhMWFudF9XaWZpUGFyYUFkanVzdChidGNvZXhpc3QsIHRydWUpOwoJCWhhbGJ0Yzg4MTJhMWFudF9BY3Rpb25XaWZpQ29ubmVjdGVkKGJ0Y29leGlzdCk7Cgl9CglCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIFJ1bkNvZXhpc3RNZWNoYW5pc20oKTw9PT1cbiIpKTsKfQoKdm9pZApoYWxidGM4ODEyYTFhbnRfSW5pdENvZXhEbSgKCSAJUEJUQ19DT0VYSVNUCQlidGNvZXhpc3QKCSkKewkKCUJPT0xFQU4JCXdpZmlfY29ubmVjdGVkPWZhbHNlOwoJLy8gZm9yY2UgdG8gcmVzZXQgY29leCBtZWNoYW5pc20KCglidGNvZXhpc3QtPmJ0Y19nZXQoYnRjb2V4aXN0LCBCVENfR0VUX0JMX1dJRklfQ09OTkVDVEVELCAmd2lmaV9jb25uZWN0ZWQpOwoJaWYoIXdpZmlfY29ubmVjdGVkKSAvLyBub24tY29ubmVjdGVkIHNjYW4KCXsKCQloYWxidGM4ODEyYTFhbnRfQWN0aW9uV2lmaU5vdENvbm5lY3RlZChidGNvZXhpc3QpOwoJfQoJZWxzZQkvLyB3aWZpIGlzIGNvbm5lY3RlZAoJewoJCWhhbGJ0Yzg4MTJhMWFudF9BY3Rpb25XaWZpQ29ubmVjdGVkKGJ0Y29leGlzdCk7Cgl9CgoJaGFsYnRjODgxMmExYW50X0Z3RGFjU3dpbmdMdmwoYnRjb2V4aXN0LCBGT1JDRV9FWEVDLCA2KTsKCWhhbGJ0Yzg4MTJhMWFudF9EZWNCdFB3cihidGNvZXhpc3QsIEZPUkNFX0VYRUMsIGZhbHNlKTsKCgkvLyBzdyBhbGwgb2ZmCgloYWxidGM4ODEyYTFhbnRfU3dNZWNoYW5pc20xKGJ0Y29leGlzdCxmYWxzZSxmYWxzZSxmYWxzZSxmYWxzZSk7CgloYWxidGM4ODEyYTFhbnRfU3dNZWNoYW5pc20yKGJ0Y29leGlzdCxmYWxzZSxmYWxzZSxmYWxzZSwweDE4KTsKCgloYWxidGM4ODEyYTFhbnRfQ29leFRhYmxlKGJ0Y29leGlzdCwgRk9SQ0VfRVhFQywgMHg1NTU1NTU1NSwgMHg1NTU1NTU1NSwgMHhmZmZmLCAweDMpOwp9CgovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLyB3b3JrIGFyb3VuZCBmdW5jdGlvbiBzdGFydCB3aXRoIHdhX2hhbGJ0Yzg4MTJhMWFudF8KLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8gZXh0ZXJuIGZ1bmN0aW9uIHN0YXJ0IHdpdGggRVhoYWxidGM4ODEyYTFhbnRfCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CnZvaWQKRVhoYWxidGM4ODEyYTFhbnRfSW5pdEh3Q29uZmlnKAoJIAlQQlRDX0NPRVhJU1QJCWJ0Y29leGlzdAoJKQp7Cgl1NEJ5dGUJdTRfdG1wPTA7Cgl1MkJ5dGUJdTJUbXA9MDsKCXUxQnl0ZQl1MV90bXA9MDsKCglCVENfUFJJTlQoQlRDX01TR19JTlRFUkZBQ0UsIElOVEZfSU5JVCwgKCJbQlRDb2V4XSwgMUFudCBJbml0IEhXIENvbmZpZyEhXG4iKSk7CgoJLy8gYmFja3VwIHJmIDB4MWUgdmFsdWUKCWNvZXhfZG0tPmJ0X3JmMHgxZV9iYWNrdXAgPSAKCQlidGNvZXhpc3QtPmJ0Y19nZXRfcmZfcmVnKGJ0Y29leGlzdCwgQlRDX1JGX0EsIDB4MWUsIDB4ZmZmZmYpOwoJCgkvL2FudCBzdyBjb250cm9sIHRvIEJUCgkgYnRjb2V4aXN0LT5idGNfd3JpdGVfNGJ5dGUoYnRjb2V4aXN0LCAweDkwMCwgMHgwMDAwMDQwMCk7CgkgYnRjb2V4aXN0LT5idGNfd3JpdGVfMWJ5dGUoYnRjb2V4aXN0LCAweDc2ZCwgMHgxKTsKCSBidGNvZXhpc3QtPmJ0Y193cml0ZV8xYnl0ZShidGNvZXhpc3QsIDB4Y2IzLCAweDc3KTsKCSBidGNvZXhpc3QtPmJ0Y193cml0ZV8xYnl0ZShidGNvZXhpc3QsIDB4Y2I3LCAweDQwKTsJCgoJLy8gMHg3OTBbNTowXT0weDUKCXUxX3RtcCA9IGJ0Y29leGlzdC0+YnRjX3JlYWRfMWJ5dGUoYnRjb2V4aXN0LCAweDc5MCk7Cgl1MV90bXAgJj0gMHhjMDsKCXUxX3RtcCB8PSAweDU7CglidGNvZXhpc3QtPmJ0Y193cml0ZV8xYnl0ZShidGNvZXhpc3QsIDB4NzkwLCB1MV90bXApOwoKCS8vIFBUQSBwYXJhbWV0ZXIKCWJ0Y29leGlzdC0+YnRjX3dyaXRlXzFieXRlKGJ0Y29leGlzdCwgMHg2Y2MsIDB4MCk7CglidGNvZXhpc3QtPmJ0Y193cml0ZV80Ynl0ZShidGNvZXhpc3QsIDB4NmM4LCAweGZmZmYpOwoJYnRjb2V4aXN0LT5idGNfd3JpdGVfNGJ5dGUoYnRjb2V4aXN0LCAweDZjNCwgMHg1NTU1NTU1NSk7CglidGNvZXhpc3QtPmJ0Y193cml0ZV80Ynl0ZShidGNvZXhpc3QsIDB4NmMwLCAweDU1NTU1NTU1KTsKCgkvLyBjb2V4IHBhcmFtZXRlcnMKCWJ0Y29leGlzdC0+YnRjX3dyaXRlXzFieXRlKGJ0Y29leGlzdCwgMHg3NzgsIDB4MSk7CgoJLy8gZW5hYmxlIGNvdW50ZXIgc3RhdGlzdGljcwoJYnRjb2V4aXN0LT5idGNfd3JpdGVfMWJ5dGUoYnRjb2V4aXN0LCAweDc2ZSwgMHg0KTsKCgkvLyBlbmFibGUgUFRBCglidGNvZXhpc3QtPmJ0Y193cml0ZV8xYnl0ZShidGNvZXhpc3QsIDB4NDAsIDB4MjApOwoKCS8vIGJ0IGNsb2NrIHJlbGF0ZWQKCXUxX3RtcCA9IGJ0Y29leGlzdC0+YnRjX3JlYWRfMWJ5dGUoYnRjb2V4aXN0LCAweDQpOwoJdTFfdG1wIHw9IEJJVDc7CglidGNvZXhpc3QtPmJ0Y193cml0ZV8xYnl0ZShidGNvZXhpc3QsIDB4NCwgdTFfdG1wKTsKCgkvLyBidCBjbG9jayByZWxhdGVkCgl1MV90bXAgPSBidGNvZXhpc3QtPmJ0Y19yZWFkXzFieXRlKGJ0Y29leGlzdCwgMHg3KTsKCXUxX3RtcCB8PSBCSVQxOwoJYnRjb2V4aXN0LT5idGNfd3JpdGVfMWJ5dGUoYnRjb2V4aXN0LCAweDcsIHUxX3RtcCk7Cn0KCnZvaWQKRVhoYWxidGM4ODEyYTFhbnRfSW5pdENvZXhEbSgKCSAJUEJUQ19DT0VYSVNUCQlidGNvZXhpc3QKCSkKewoJQlRDX1BSSU5UKEJUQ19NU0dfSU5URVJGQUNFLCBJTlRGX0lOSVQsICgiW0JUQ29leF0sIENvZXggTWVjaGFuaXNtIEluaXQhIVxuIikpOwoKCWJ0Y29leGlzdC0+c3RvcF9jb2V4X2RtID0gZmFsc2U7CgoJaGFsYnRjODgxMmExYW50X0luaXRDb2V4RG0oYnRjb2V4aXN0KTsKfQoKdm9pZApFWGhhbGJ0Yzg4MTJhMWFudF9EaXNwbGF5Q29leEluZm8oCgkgCVBCVENfQ09FWElTVAkJYnRjb2V4aXN0CgkpCnsKCVBCVENfQk9BUkRfSU5GTwkJYm9hcmRfaW5mbz0mYnRjb2V4aXN0LT5ib2FyZEluZm87CglQQlRDX1NUQUNLX0lORk8JCXN0YWNrX2luZm89JmJ0Y29leGlzdC0+c3RhY2tfaW5mbzsKCXB1MUJ5dGUJCQkJY2xpX2J1Zj1idGNvZXhpc3QtPmNsaV9idWY7Cgl1MUJ5dGUJCQkJdTFfdG1wWzRdLCBpLCBidF9pbmZvX2V4dCwgcHNUZG1hQ2FzZT0wOwoJdTRCeXRlCQkJCXU0X3RtcFs0XTsKCUJPT0xFQU4JCQkJcm9hbT1mYWxzZSwgc2Nhbj1mYWxzZSwgbGluaz1mYWxzZSwgd2lmaV91bmRlcjVnPWZhbHNlOwoJQk9PTEVBTgkJCQlidF9oc19vbj1mYWxzZSwgd2lmaV9idXN5PWZhbHNlOwoJczRCeXRlCQkJCXdpZmlfcnNzaT0wLCBidF9oc19yc3NpPTA7Cgl1NEJ5dGUJCQkJd2lmaV9idywgd2lmaVRyYWZmaWNEaXI7Cgl1MUJ5dGUJCQkJd2lmaURvdDExQ2hubCwgd2lmaUhzQ2hubDsKCglDTF9TUFJJTlRGKGNsaV9idWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gPT09PT09PT09PT09W0JUIENvZXhpc3QgaW5mb109PT09PT09PT09PT0iKTsKCUNMX1BSSU5URihjbGlfYnVmKTsKCglpZihidGNvZXhpc3QtPm1hbnVhbF9jb250cm9sKQoJewoJCUNMX1NQUklOVEYoY2xpX2J1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiA9PT09PT09PT09PT1bVW5kZXIgTWFudWFsIENvbnRyb2xdPT09PT09PT09PT09Iik7CgkJQ0xfUFJJTlRGKGNsaV9idWYpOwoJCUNMX1NQUklOVEYoY2xpX2J1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iKTsKCQlDTF9QUklOVEYoY2xpX2J1Zik7Cgl9CglpZihidGNvZXhpc3QtPnN0b3BfY29leF9kbSkKCXsKCQlDTF9TUFJJTlRGKGNsaV9idWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gPT09PT09PT09PT09W0NvZXggaXMgU1RPUFBFRF09PT09PT09PT09PT0iKTsKCQlDTF9QUklOVEYoY2xpX2J1Zik7CgkJQ0xfU1BSSU5URihjbGlfYnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpOwoJCUNMX1BSSU5URihjbGlfYnVmKTsKCX0KCglpZighYm9hcmRfaW5mby0+YkJ0RXhpc3QpCgl7CgkJQ0xfU1BSSU5URihjbGlfYnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuIEJUIG5vdCBleGlzdHMgISEhIik7CgkJQ0xfUFJJTlRGKGNsaV9idWYpOwoJCXJldHVybjsKCX0KCglDTF9TUFJJTlRGKGNsaV9idWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAlZC8gJWQgIiwgIkFudCBQRyBudW1iZXIvIEFudCBtZWNoYW5pc206IiwgXAoJCWJvYXJkX2luZm8tPnBnQW50TnVtLCBib2FyZF9pbmZvLT5idGRtQW50TnVtKTsKCUNMX1BSSU5URihjbGlfYnVmKTsJCgkKCUNMX1NQUklOVEYoY2xpX2J1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9ICVzIC8gJWQiLCAiQlQgc3RhY2svIGhjaSBleHQgdmVyIiwgXAoJCSgoc3RhY2tfaW5mby0+YlByb2ZpbGVOb3RpZmllZCk/ICJZZXMiOiJObyIpLCBzdGFja19pbmZvLT5oY2lWZXJzaW9uKTsKCUNMX1BSSU5URihjbGlfYnVmKTsKCWJ0Y29leGlzdC0+YnRjX2Rpc3BfZGJnX21zZyhidGNvZXhpc3QsIEJUQ19EQkdfRElTUF9CVF9GV19WRVIpOwoKCWJ0Y29leGlzdC0+YnRjX2dldChidGNvZXhpc3QsIEJUQ19HRVRfQkxfSFNfT1BFUkFUSU9OLCAmYnRfaHNfb24pOwoJYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwgQlRDX0dFVF9VMV9XSUZJX0RPVDExX0NITkwsICZ3aWZpRG90MTFDaG5sKTsKCWJ0Y29leGlzdC0+YnRjX2dldChidGNvZXhpc3QsIEJUQ19HRVRfVTFfV0lGSV9IU19DSE5MLCAmd2lmaUhzQ2hubCk7CglDTF9TUFJJTlRGKGNsaV9idWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAlZCAvICVkKCVkKSIsICJEb3QxMSBjaGFubmVsIC8gSHNDaG5sKEhzTW9kZSkiLCBcCgkJd2lmaURvdDExQ2hubCwgd2lmaUhzQ2hubCwgYnRfaHNfb24pOwoJQ0xfUFJJTlRGKGNsaV9idWYpOwoKCUNMX1NQUklOVEYoY2xpX2J1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9ICUwMnggJTAyeCAlMDJ4ICIsICJIMkMgV2lmaSBpbmZvcm0gYnQgY2hubCBJbmZvIiwgXAoJCWNvZXhfZG0tPndpZmlfY2hubF9pbmZvWzBdLCBjb2V4X2RtLT53aWZpX2NobmxfaW5mb1sxXSwKCQljb2V4X2RtLT53aWZpX2NobmxfaW5mb1syXSk7CglDTF9QUklOVEYoY2xpX2J1Zik7CgoJYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwgQlRDX0dFVF9TNF9XSUZJX1JTU0ksICZ3aWZpX3Jzc2kpOwoJYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwgQlRDX0dFVF9TNF9IU19SU1NJLCAmYnRfaHNfcnNzaSk7CglDTF9TUFJJTlRGKGNsaV9idWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAlZC8gJWQiLCAiV2lmaSByc3NpLyBIUyByc3NpIiwgXAoJCXdpZmlfcnNzaSwgYnRfaHNfcnNzaSk7CglDTF9QUklOVEYoY2xpX2J1Zik7CgoJYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwgQlRDX0dFVF9CTF9XSUZJX1NDQU4sICZzY2FuKTsKCWJ0Y29leGlzdC0+YnRjX2dldChidGNvZXhpc3QsIEJUQ19HRVRfQkxfV0lGSV9MSU5LLCAmbGluayk7CglidGNvZXhpc3QtPmJ0Y19nZXQoYnRjb2V4aXN0LCBCVENfR0VUX0JMX1dJRklfUk9BTSwgJnJvYW0pOwoJQ0xfU1BSSU5URihjbGlfYnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gJWQvICVkLyAlZCAiLCAiV2lmaSBsaW5rLyByb2FtLyBzY2FuIiwgXAoJCWxpbmssIHJvYW0sIHNjYW4pOwoJQ0xfUFJJTlRGKGNsaV9idWYpOwoKCWJ0Y29leGlzdC0+YnRjX2dldChidGNvZXhpc3QsIEJUQ19HRVRfQkxfV0lGSV9VTkRFUl81RywgJndpZmlfdW5kZXI1Zyk7CglidGNvZXhpc3QtPmJ0Y19nZXQoYnRjb2V4aXN0LCBCVENfR0VUX1U0X1dJRklfQlcsICZ3aWZpX2J3KTsKCWJ0Y29leGlzdC0+YnRjX2dldChidGNvZXhpc3QsIEJUQ19HRVRfQkxfV0lGSV9CVVNZLCAmd2lmaV9idXN5KTsKCWJ0Y29leGlzdC0+YnRjX2dldChidGNvZXhpc3QsIEJUQ19HRVRfVTRfV0lGSV9UUkFGRklDX0RJUkVDVElPTiwgJndpZmlUcmFmZmljRGlyKTsKCUNMX1NQUklOVEYoY2xpX2J1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9ICVzIC8gJXMvICVzICIsICJXaWZpIHN0YXR1cyIsIFwKCQkod2lmaV91bmRlcjVnPyAiNUciOiIyLjRHIiksCgkJKChCVENfV0lGSV9CV19MRUdBQ1k9PXdpZmlfYncpPyAiTGVnYWN5IjogKCgoQlRDX1dJRklfQldfSFQ0MD09d2lmaV9idyk/ICJIVDQwIjoiSFQyMCIpKSksCgkJKCghd2lmaV9idXN5KT8gImlkbGUiOiAoKEJUQ19XSUZJX1RSQUZGSUNfVFg9PXdpZmlUcmFmZmljRGlyKT8gInVwbGluayI6ImRvd25saW5rIikpKTsKCUNMX1BSSU5URihjbGlfYnVmKTsKCUNMX1NQUklOVEYoY2xpX2J1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9IFslcy8gJWQvICVkXSAiLCAiQlQgW3N0YXR1cy8gcnNzaS8gcmV0cnlDbnRdIiwgXAoJCSgoY29leF9zdGEtPmMyaF9idF9pbnF1aXJ5X3BhZ2UpPygiaW5xdWlyeS9wYWdlIHNjYW4iKTooKEJUXzg4MTJBXzFBTlRfQlRfU1RBVFVTX05PTl9DT05ORUNURURfSURMRSA9PSBjb2V4X2RtLT5idF9zdGF0dXMpPyAibm9uLWNvbm5lY3RlZCBpZGxlIjoKCQkoICAoQlRfODgxMkFfMUFOVF9CVF9TVEFUVVNfQ09OTkVDVEVEX0lETEUgPT0gY29leF9kbS0+YnRfc3RhdHVzKT8gImNvbm5lY3RlZC1pZGxlIjoiYnVzeSIpKSksCgkJY29leF9zdGEtPmJ0X3Jzc2ksIGNvZXhfc3RhLT5idF9yZXRyeV9jbnQpOwoJQ0xfUFJJTlRGKGNsaV9idWYpOwoJCglpZihzdGFja19pbmZvLT5iUHJvZmlsZU5vdGlmaWVkKQoJewkJCQoJCUNMX1NQUklOVEYoY2xpX2J1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9ICVkIC8gJWQgLyAlZCAvICVkIiwgIlNDTy9ISUQvUEFOL0EyRFAiLCBcCgkJCXN0YWNrX2luZm8tPnNjb19leGlzdCwgc3RhY2tfaW5mby0+aGlkX2V4aXN0LCBzdGFja19pbmZvLT5wYW5fZXhpc3QsIHN0YWNrX2luZm8tPmEyZHBfZXhpc3QpOwoJCUNMX1BSSU5URihjbGlfYnVmKTsJCgoJCWJ0Y29leGlzdC0+YnRjX2Rpc3BfZGJnX21zZyhidGNvZXhpc3QsIEJUQ19EQkdfRElTUF9CVF9MSU5LX0lORk8pOwoJfQoKCWJ0X2luZm9fZXh0ID0gY29leF9zdGEtPmJ0X2luZm9fZXh0OwoJQ0xfU1BSSU5URihjbGlfYnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gJXMiLCAiQlQgSW5mbyBBMkRQIHJhdGUiLCBcCgkJKGJ0X2luZm9fZXh0JkJJVDApPyAiQmFzaWMgcmF0ZSI6IkVEUiByYXRlIik7CglDTF9QUklOVEYoY2xpX2J1Zik7CQoKCWZvcihpPTA7IGk8QlRfSU5GT19TUkNfODgxMkFfMUFOVF9NQVg7IGkrKykKCXsKCQlpZihjb2V4X3N0YS0+YnRfaW5mb19jMmhfY250W2ldKQoJCXsJCQkJCgkJCUNMX1NQUklOVEYoY2xpX2J1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMngoJWQpIiwgR0xCdEluZm9TcmM4ODEyYTFBbnRbaV0sIFwKCQkJCWNvZXhfc3RhLT5idF9pbmZvX2MyaFtpXVswXSwgY29leF9zdGEtPmJ0X2luZm9fYzJoW2ldWzFdLAoJCQkJY29leF9zdGEtPmJ0X2luZm9fYzJoW2ldWzJdLCBjb2V4X3N0YS0+YnRfaW5mb19jMmhbaV1bM10sCgkJCQljb2V4X3N0YS0+YnRfaW5mb19jMmhbaV1bNF0sIGNvZXhfc3RhLT5idF9pbmZvX2MyaFtpXVs1XSwKCQkJCWNvZXhfc3RhLT5idF9pbmZvX2MyaFtpXVs2XSwgY29leF9zdGEtPmJ0X2luZm9fYzJoX2NudFtpXSk7CgkJCUNMX1BSSU5URihjbGlfYnVmKTsKCQl9Cgl9CglDTF9TUFJJTlRGKGNsaV9idWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAlcy8lcywgKDB4JXgvMHgleCkiLCAiUFMgc3RhdGUsIElQUy9MUFMsIChscHMvcnB3bSkiLCBcCgkJKChjb2V4X3N0YS0+dW5kZXJfaXBzPyAiSVBTIE9OIjoiSVBTIE9GRiIpKSwKCQkoKGNvZXhfc3RhLT51bmRlcl9scHM/ICJMUFMgT04iOiJMUFMgT0ZGIikpLCAKCQlidGNvZXhpc3QtPmJ0X2luZm8ubHBzMUFudCwgCgkJYnRjb2V4aXN0LT5idF9pbmZvLnJwd20xQW50KTsKCUNMX1BSSU5URihjbGlfYnVmKTsKCWJ0Y29leGlzdC0+YnRjX2Rpc3BfZGJnX21zZyhidGNvZXhpc3QsIEJUQ19EQkdfRElTUF9GV19QV1JfTU9ERV9DTUQpOwoKCWlmKCFidGNvZXhpc3QtPm1hbnVhbF9jb250cm9sKQoJewoJCS8vIFN3IG1lY2hhbmlzbQkKCQlDTF9TUFJJTlRGKGNsaV9idWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMiLCAiPT09PT09PT09PT09W1N3IG1lY2hhbmlzbV09PT09PT09PT09PT0iKTsKCQlDTF9QUklOVEYoY2xpX2J1Zik7CgkKCQlDTF9TUFJJTlRGKGNsaV9idWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAlZC8gJWQvICVkLyAlZCAiLCAiU00xW1NoUmYvIExwUkEvIExpbURpZy8gYnRMbmFdIiwgXAoJCQljb2V4X2RtLT5jdXJfcmZfcnhfbHBmX3NocmluaywgY29leF9kbS0+Y3VyX2xvd19wZW5hbHR5X3JhLCBjb2V4X2RtLT5saW1pdGVkX2RpZywgY29leF9kbS0+YkN1ckJ0TG5hQ29uc3RyYWluKTsKCQlDTF9QUklOVEYoY2xpX2J1Zik7CgkJQ0xfU1BSSU5URihjbGlfYnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gJWQvICVkLyAlZCgweCV4KSAiLCAiU00yW0FnY1QvIEFkY0IvIFN3RGFjU3dpbmcobHZsKV0iLCBcCgkJCWNvZXhfZG0tPmN1cl9hZ2NfdGFibGVfZW4sIGNvZXhfZG0tPmN1cl9hZGNfYmFja19vZmYsIGNvZXhfZG0tPmN1cl9kYWNfc3dpbmdfb24sIGNvZXhfZG0tPmN1cl9kYWNfc3dpbmdfbHZsKTsKCQlDTF9QUklOVEYoY2xpX2J1Zik7CgkKCQkvLyBGdyBtZWNoYW5pc20JCQoJCUNMX1NQUklOVEYoY2xpX2J1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyIsICI9PT09PT09PT09PT1bRncgbWVjaGFuaXNtXT09PT09PT09PT09PSIpOwoJCUNMX1BSSU5URihjbGlfYnVmKTsJCgoJCXBzVGRtYUNhc2UgPSBjb2V4X2RtLT5jdXJfcHNfdGRtYTsKCQlDTF9TUFJJTlRGKGNsaV9idWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggY2FzZS0lZCIsICJQUyBURE1BIiwgXAoJCQljb2V4X2RtLT5wc190ZG1hX3BhcmFbMF0sIGNvZXhfZG0tPnBzX3RkbWFfcGFyYVsxXSwKCQkJY29leF9kbS0+cHNfdGRtYV9wYXJhWzJdLCBjb2V4X2RtLT5wc190ZG1hX3BhcmFbM10sCgkJCWNvZXhfZG0tPnBzX3RkbWFfcGFyYVs0XSwgcHNUZG1hQ2FzZSk7CgkJQ0xfUFJJTlRGKGNsaV9idWYpOwoKCQlDTF9TUFJJTlRGKGNsaV9idWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAweCV4ICIsICJMYXRlc3QgZXJyb3IgY29uZGl0aW9uKHNob3VsZCBiZSAwKSIsIFwKCQkJY29leF9kbS0+ZXJyb3JfY29uZGl0aW9uKTsKCQlDTF9QUklOVEYoY2xpX2J1Zik7CgkJCgkJQ0xfU1BSSU5URihjbGlfYnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gJWQvICVkICIsICJEZWNCdFB3ci8gSWduV2xhbkFjdCIsIFwKCQkJY29leF9kbS0+Y3VyX2RlY19idF9wd3IsIGNvZXhfZG0tPmN1cl9pZ25vcmVfd2xhbl9hY3QpOwoJCUNMX1BSSU5URihjbGlfYnVmKTsKCX0KCgkvLyBIdyBzZXR0aW5nCQkKCUNMX1NQUklOVEYoY2xpX2J1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyIsICI9PT09PT09PT09PT1bSHcgc2V0dGluZ109PT09PT09PT09PT0iKTsKCUNMX1BSSU5URihjbGlfYnVmKTsJCgoJQ0xfU1BSSU5URihjbGlfYnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gMHgleCIsICJSRi1BLCAweDFlIGluaXRWYWwiLCBcCgkJY29leF9kbS0+YnRfcmYweDFlX2JhY2t1cCk7CglDTF9QUklOVEYoY2xpX2J1Zik7CgoJdTFfdG1wWzBdID0gYnRjb2V4aXN0LT5idGNfcmVhZF8xYnl0ZShidGNvZXhpc3QsIDB4Nzc4KTsKCUNMX1NQUklOVEYoY2xpX2J1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9IDB4JXgiLCAiMHg3NzgiLCBcCgkJdTFfdG1wWzBdKTsKCUNMX1BSSU5URihjbGlfYnVmKTsKCQoJdTFfdG1wWzBdID0gYnRjb2V4aXN0LT5idGNfcmVhZF8xYnl0ZShidGNvZXhpc3QsIDB4OTJjKTsKCXU0X3RtcFswXSA9IGJ0Y29leGlzdC0+YnRjX3JlYWRfNGJ5dGUoYnRjb2V4aXN0LCAweDkzMCk7CglDTF9TUFJJTlRGKGNsaV9idWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAweCV4LyAweCV4IiwgIjB4OTJjLyAweDkzMCIsIFwKCQkodTFfdG1wWzBdKSwgdTRfdG1wWzBdKTsKCUNMX1BSSU5URihjbGlfYnVmKTsKCgl1MV90bXBbMF0gPSBidGNvZXhpc3QtPmJ0Y19yZWFkXzFieXRlKGJ0Y29leGlzdCwgMHg0MCk7Cgl1MV90bXBbMV0gPSBidGNvZXhpc3QtPmJ0Y19yZWFkXzFieXRlKGJ0Y29leGlzdCwgMHg0Zik7CglDTF9TUFJJTlRGKGNsaV9idWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAweCV4LyAweCV4IiwgIjB4NDAvIDB4NGYiLCBcCgkJdTFfdG1wWzBdLCB1MV90bXBbMV0pOwoJQ0xfUFJJTlRGKGNsaV9idWYpOwoKCXU0X3RtcFswXSA9IGJ0Y29leGlzdC0+YnRjX3JlYWRfNGJ5dGUoYnRjb2V4aXN0LCAweDU1MCk7Cgl1MV90bXBbMF0gPSBidGNvZXhpc3QtPmJ0Y19yZWFkXzFieXRlKGJ0Y29leGlzdCwgMHg1MjIpOwoJQ0xfU1BSSU5URihjbGlfYnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gMHgleC8gMHgleCIsICIweDU1MChiY24gY3RybCkvMHg1MjIiLCBcCgkJdTRfdG1wWzBdLCB1MV90bXBbMF0pOwoJQ0xfUFJJTlRGKGNsaV9idWYpOwoKCXU0X3RtcFswXSA9IGJ0Y29leGlzdC0+YnRjX3JlYWRfNGJ5dGUoYnRjb2V4aXN0LCAweGM1MCk7CglDTF9TUFJJTlRGKGNsaV9idWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAweCV4IiwgIjB4YzUwKGRpZykiLCBcCgkJdTRfdG1wWzBdKTsKCUNMX1BSSU5URihjbGlfYnVmKTsKCiNpZiAwCgl1NF90bXBbMF0gPSBidGNvZXhpc3QtPmJ0Y19yZWFkXzRieXRlKGJ0Y29leGlzdCwgMHhmNDgpOwoJdTRfdG1wWzFdID0gYnRjb2V4aXN0LT5idGNfcmVhZF80Ynl0ZShidGNvZXhpc3QsIDB4ZjRjKTsKCUNMX1NQUklOVEYoY2xpX2J1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9IDB4JXgvIDB4JXgiLCAiMHhmNDgvIDB4ZjRjIChGQSBjbnQpIiwgXAoJCXU0X3RtcFswXSwgdTRfdG1wWzFdKTsKCUNMX1BSSU5URihjbGlfYnVmKTsKI2VuZGlmCgoJdTRfdG1wWzBdID0gYnRjb2V4aXN0LT5idGNfcmVhZF80Ynl0ZShidGNvZXhpc3QsIDB4NmMwKTsKCXU0X3RtcFsxXSA9IGJ0Y29leGlzdC0+YnRjX3JlYWRfNGJ5dGUoYnRjb2V4aXN0LCAweDZjNCk7Cgl1NF90bXBbMl0gPSBidGNvZXhpc3QtPmJ0Y19yZWFkXzRieXRlKGJ0Y29leGlzdCwgMHg2YzgpOwoJdTFfdG1wWzBdID0gYnRjb2V4aXN0LT5idGNfcmVhZF8xYnl0ZShidGNvZXhpc3QsIDB4NmNjKTsKCUNMX1NQUklOVEYoY2xpX2J1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9IDB4JXgvIDB4JXgvIDB4JXgvIDB4JXgiLCAiMHg2YzAvMHg2YzQvMHg2YzgvMHg2Y2MoY29leFRhYmxlKSIsIFwKCQl1NF90bXBbMF0sIHU0X3RtcFsxXSwgdTRfdG1wWzJdLCB1MV90bXBbMF0pOwoJQ0xfUFJJTlRGKGNsaV9idWYpOwoKCUNMX1NQUklOVEYoY2xpX2J1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9ICVkLyAlZCIsICIweDc3MChocCByeFszMToxNl0vdHhbMTU6MF0pIiwgXAoJCWNvZXhfc3RhLT5oaWdoX3ByaW9yaXR5X3J4LCBjb2V4X3N0YS0+aGlnaF9wcmlvcml0eV90eCk7CglDTF9QUklOVEYoY2xpX2J1Zik7CglDTF9TUFJJTlRGKGNsaV9idWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAlZC8gJWQiLCAiMHg3NzQobHAgcnhbMzE6MTZdL3R4WzE1OjBdKSIsIFwKCQljb2V4X3N0YS0+bG93X3ByaW9yaXR5X3J4LCBjb2V4X3N0YS0+bG93X3ByaW9yaXR5X3R4KTsKCUNMX1BSSU5URihjbGlfYnVmKTsKCQoJYnRjb2V4aXN0LT5idGNfZGlzcF9kYmdfbXNnKGJ0Y29leGlzdCwgQlRDX0RCR19ESVNQX0NPRVhfU1RBVElTVElDUyk7Cn0KCgp2b2lkCkVYaGFsYnRjODgxMmExYW50X0lwc05vdGlmeSgKCSAJUEJUQ19DT0VYSVNUCQlidGNvZXhpc3QsCgkgCXUxQnl0ZQkJCXR5cGUKCSkKewoJdTRCeXRlCXU0X3RtcD0wOwoKCWlmKGJ0Y29leGlzdC0+bWFudWFsX2NvbnRyb2wgfHwJYnRjb2V4aXN0LT5zdG9wX2NvZXhfZG0pCgkJcmV0dXJuOwoKCWlmKEJUQ19JUFNfRU5URVIgPT0gdHlwZSkKCXsKCQlCVENfUFJJTlQoQlRDX01TR19JTlRFUkZBQ0UsIElOVEZfTk9USUZZLCAoIltCVENvZXhdLCBJUFMgRU5URVIgbm90aWZ5XG4iKSk7CgkJY29leF9zdGEtPnVuZGVyX2lwcyA9IHRydWU7CgoJCS8vIDB4NGNbMjNdPTEKCQl1NF90bXAgPSBidGNvZXhpc3QtPmJ0Y19yZWFkXzRieXRlKGJ0Y29leGlzdCwgMHg0Yyk7CgkJdTRfdG1wIHw9IEJJVDIzOwoJCWJ0Y29leGlzdC0+YnRjX3dyaXRlXzRieXRlKGJ0Y29leGlzdCwgMHg0YywgdTRfdG1wKTsKCQkKCQloYWxidGM4ODEyYTFhbnRfQ29leEFsbE9mZihidGNvZXhpc3QpOwoJfQoJZWxzZSBpZihCVENfSVBTX0xFQVZFID09IHR5cGUpCgl7CgkJQlRDX1BSSU5UKEJUQ19NU0dfSU5URVJGQUNFLCBJTlRGX05PVElGWSwgKCJbQlRDb2V4XSwgSVBTIExFQVZFIG5vdGlmeVxuIikpOwoJCWNvZXhfc3RhLT51bmRlcl9pcHMgPSBmYWxzZTsKCQkvL2hhbGJ0Yzg4MTJhMWFudF9Jbml0Q29leERtKGJ0Y29leGlzdCk7Cgl9Cn0KCnZvaWQKRVhoYWxidGM4ODEyYTFhbnRfTHBzTm90aWZ5KAoJIAlQQlRDX0NPRVhJU1QJCWJ0Y29leGlzdCwKCSAJdTFCeXRlCQkJdHlwZQoJKQp7CglpZihidGNvZXhpc3QtPm1hbnVhbF9jb250cm9sIHx8IGJ0Y29leGlzdC0+c3RvcF9jb2V4X2RtKQoJCXJldHVybjsKCglpZihCVENfTFBTX0VOQUJMRSA9PSB0eXBlKQoJewoJCUJUQ19QUklOVChCVENfTVNHX0lOVEVSRkFDRSwgSU5URl9OT1RJRlksICgiW0JUQ29leF0sIExQUyBFTkFCTEUgbm90aWZ5XG4iKSk7CgkJY29leF9zdGEtPnVuZGVyX2xwcyA9IHRydWU7Cgl9CgllbHNlIGlmKEJUQ19JUFNfTEVBVkUgPT0gdHlwZSkKCXsKCQlCVENfUFJJTlQoQlRDX01TR19JTlRFUkZBQ0UsIElOVEZfTk9USUZZLCAoIltCVENvZXhdLCBMUFMgRElTQUJMRSBub3RpZnlcbiIpKTsKCQljb2V4X3N0YS0+dW5kZXJfbHBzID0gZmFsc2U7Cgl9Cn0KCnZvaWQKRVhoYWxidGM4ODEyYTFhbnRfU2Nhbk5vdGlmeSgKCSAJUEJUQ19DT0VYSVNUCQlidGNvZXhpc3QsCgkgCXUxQnl0ZQkJCXR5cGUKCSkKewoJUEJUQ19TVEFDS19JTkZPIAlzdGFja19pbmZvPSZidGNvZXhpc3QtPnN0YWNrX2luZm87CglCT09MRUFOIAkJd2lmaV9jb25uZWN0ZWQ9ZmFsc2U7CQoKCWlmKGJ0Y29leGlzdC0+bWFudWFsX2NvbnRyb2wgfHxidGNvZXhpc3QtPnN0b3BfY29leF9kbSkKCQlyZXR1cm47CgoJYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwgQlRDX0dFVF9CTF9XSUZJX0NPTk5FQ1RFRCwgJndpZmlfY29ubmVjdGVkKTsKCWlmKEJUQ19TQ0FOX1NUQVJUID09IHR5cGUpCgl7CQoJCUJUQ19QUklOVChCVENfTVNHX0lOVEVSRkFDRSwgSU5URl9OT1RJRlksICgiW0JUQ29leF0sIFNDQU4gU1RBUlQgbm90aWZ5XG4iKSk7CgkJaWYoIXdpZmlfY29ubmVjdGVkKQkvLyBub24tY29ubmVjdGVkIHNjYW4KCQl7CgkJCS8vc2V0IDB4NTUwWzNdPTEgYmVmb3JlIFBzVGRtYQoJCQkvL2hhbGJ0Yzg4MTJhMWFudF9SZWcweDU1MEJpdDMoYnRjb2V4aXN0LCB0cnVlKTsKCQkJaGFsYnRjODgxMmExYW50X0FjdGlvbldpZmlOb3RDb25uZWN0ZWRBc3NvQXV0aFNjYW4oYnRjb2V4aXN0KTsKCQl9CgkJZWxzZQkvLyB3aWZpIGlzIGNvbm5lY3RlZAoJCXsKCQkJaGFsYnRjODgxMmExYW50X0FjdGlvbldpZmlDb25uZWN0ZWRTY2FuKGJ0Y29leGlzdCk7CgkJfQoJfQoJZWxzZSBpZihCVENfU0NBTl9GSU5JU0ggPT0gdHlwZSkKCXsKCQlCVENfUFJJTlQoQlRDX01TR19JTlRFUkZBQ0UsIElOVEZfTk9USUZZLCAoIltCVENvZXhdLCBTQ0FOIEZJTklTSCBub3RpZnlcbiIpKTsKCQlpZighd2lmaV9jb25uZWN0ZWQpCS8vIG5vbi1jb25uZWN0ZWQgc2NhbgoJCXsKCQkJLy9oYWxidGM4ODEyYTFhbnRfUmVnMHg1NTBCaXQzKGJ0Y29leGlzdCwgZmFsc2UpOwoJCQloYWxidGM4ODEyYTFhbnRfQWN0aW9uV2lmaU5vdENvbm5lY3RlZChidGNvZXhpc3QpOwoJCX0KCQllbHNlCgkJewoJCQloYWxidGM4ODEyYTFhbnRfQWN0aW9uV2lmaUNvbm5lY3RlZChidGNvZXhpc3QpOwoJCX0KCX0KfQoKdm9pZApFWGhhbGJ0Yzg4MTJhMWFudF9Db25uZWN0Tm90aWZ5KAoJIAlQQlRDX0NPRVhJU1QJCWJ0Y29leGlzdCwKCSAJdTFCeXRlCQkJdHlwZQoJKQp7CglQQlRDX1NUQUNLX0lORk8gCXN0YWNrX2luZm89JmJ0Y29leGlzdC0+c3RhY2tfaW5mbzsKCUJPT0xFQU4JCQl3aWZpX2Nvbm5lY3RlZD1mYWxzZTsJCgoJaWYoYnRjb2V4aXN0LT5tYW51YWxfY29udHJvbCB8fGJ0Y29leGlzdC0+c3RvcF9jb2V4X2RtKQoJCXJldHVybjsKCglpZihCVENfQVNTT0NJQVRFX1NUQVJUID09IHR5cGUpCgl7CgkJQlRDX1BSSU5UKEJUQ19NU0dfSU5URVJGQUNFLCBJTlRGX05PVElGWSwgKCJbQlRDb2V4XSwgQ09OTkVDVCBTVEFSVCBub3RpZnlcbiIpKTsKCQlpZihidGNvZXhpc3QtPmJ0X2luZm8uYnRfZGlzYWJsZWQpCgkJewkJCQoJCQloYWxidGM4ODEyYTFhbnRfUHNUZG1hQ2hlY2tGb3JQb3dlclNhdmVTdGF0ZShidGNvZXhpc3QsIGZhbHNlKTsKCQkJYnRjb2V4aXN0LT5idGNfc2V0KGJ0Y29leGlzdCwgQlRDX1NFVF9BQ1RfTEVBVkVfTFBTLCBOVUxMKTsKCQkJaGFsYnRjODgxMmExYW50X1BzVGRtYShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCBmYWxzZSwgOSk7CgkJfQoJCWVsc2UKCQl7CgkJCWhhbGJ0Yzg4MTJhMWFudF9BY3Rpb25XaWZpTm90Q29ubmVjdGVkQXNzb0F1dGhTY2FuKGJ0Y29leGlzdCk7CgkJfQoJfQoJZWxzZSBpZihCVENfQVNTT0NJQVRFX0ZJTklTSCA9PSB0eXBlKQoJewoJCUJUQ19QUklOVChCVENfTVNHX0lOVEVSRkFDRSwgSU5URl9OT1RJRlksICgiW0JUQ29leF0sIENPTk5FQ1QgRklOSVNIIG5vdGlmeVxuIikpOwoJCQoJCWJ0Y29leGlzdC0+YnRjX2dldChidGNvZXhpc3QsIEJUQ19HRVRfQkxfV0lGSV9DT05ORUNURUQsICZ3aWZpX2Nvbm5lY3RlZCk7CgkJaWYoIXdpZmlfY29ubmVjdGVkKSAvLyBub24tY29ubmVjdGVkIHNjYW4KCQl7CgkJCS8vaGFsYnRjODgxMmExYW50X1JlZzB4NTUwQml0MyhidGNvZXhpc3QsIGZhbHNlKTsKCQkJaGFsYnRjODgxMmExYW50X0FjdGlvbldpZmlOb3RDb25uZWN0ZWQoYnRjb2V4aXN0KTsKCQl9CgkJZWxzZQoJCXsKCQkJaGFsYnRjODgxMmExYW50X0FjdGlvbldpZmlDb25uZWN0ZWQoYnRjb2V4aXN0KTsKCQl9Cgl9Cn0KCnZvaWQKRVhoYWxidGM4ODEyYTFhbnRfTWVkaWFTdGF0dXNOb3RpZnkoCgkgCVBCVENfQ09FWElTVAkJCWJ0Y29leGlzdCwKCSAJdTFCeXRlCQkJCXR5cGUKCSkKewoJdTFCeXRlCQkJZGF0YUxlbj01OwoJdTFCeXRlCQkJYnVmWzZdID0gezB9OwoJdTFCeXRlCQkJaDJjX3BhcmFtZXRlclszXSA9ezB9OwoJQk9PTEVBTgkJCXdpZmlfdW5kZXI1Zz1mYWxzZTsKCXU0Qnl0ZQkJCXdpZmlfYnc7Cgl1MUJ5dGUJCQl3aWZpX2NlbnRyYWxfY2hubDsKCglpZihidGNvZXhpc3QtPm1hbnVhbF9jb250cm9sIHx8YnRjb2V4aXN0LT5zdG9wX2NvZXhfZG0pCgkJcmV0dXJuOwoKCWJ0Y29leGlzdC0+YnRjX2dldChidGNvZXhpc3QsIEJUQ19HRVRfQkxfV0lGSV9VTkRFUl81RywgJndpZmlfdW5kZXI1Zyk7CgoJLy8gb25seSAyLjRHIHdlIG5lZWQgdG8gaW5mb3JtIGJ0IHRoZSBjaG5sIG1hc2sKCWlmKCF3aWZpX3VuZGVyNWcpCgl7CgkJaWYoQlRDX01FRElBX0NPTk5FQ1QgPT0gdHlwZSkKCQl7CgkJCWgyY19wYXJhbWV0ZXJbMF0gPSAweDE7CgkJfQoJCWJ0Y29leGlzdC0+YnRjX2dldChidGNvZXhpc3QsIEJUQ19HRVRfVTRfV0lGSV9CVywgJndpZmlfYncpOwoJCWJ0Y29leGlzdC0+YnRjX2dldChidGNvZXhpc3QsIEJUQ19HRVRfVTFfV0lGSV9DRU5UUkFMX0NITkwsICZ3aWZpX2NlbnRyYWxfY2hubCk7CgkJaDJjX3BhcmFtZXRlclsxXSA9IHdpZmlfY2VudHJhbF9jaG5sOwoJCWlmKEJUQ19XSUZJX0JXX0hUNDAgPT0gd2lmaV9idykKCQkJaDJjX3BhcmFtZXRlclsyXSA9IDB4MzA7CgkJZWxzZQoJCQloMmNfcGFyYW1ldGVyWzJdID0gMHgyMDsKCX0KCQkKCWNvZXhfZG0tPndpZmlfY2hubF9pbmZvWzBdID0gaDJjX3BhcmFtZXRlclswXTsKCWNvZXhfZG0tPndpZmlfY2hubF9pbmZvWzFdID0gaDJjX3BhcmFtZXRlclsxXTsKCWNvZXhfZG0tPndpZmlfY2hubF9pbmZvWzJdID0gaDJjX3BhcmFtZXRlclsyXTsKCQoJYnVmWzBdID0gZGF0YUxlbjsKCWJ1ZlsxXSA9IDB4NTsJCQkJLy8gT1BfQ29kZQoJYnVmWzJdID0gMHgzOwkJCQkvLyBPUF9Db2RlX0xlbmd0aAoJYnVmWzNdID0gaDJjX3BhcmFtZXRlclswXTsgCS8vIE9QX0NvZGVfQ29udGVudAoJYnVmWzRdID0gaDJjX3BhcmFtZXRlclsxXTsKCWJ1Zls1XSA9IGgyY19wYXJhbWV0ZXJbMl07CgkJCglidGNvZXhpc3QtPmJ0Y19zZXQoYnRjb2V4aXN0LCBCVENfU0VUX0FDVF9DVFJMX0JUX0NPRVgsIChQVk9JRCkmYnVmWzBdKTsJCQp9Cgp2b2lkCkVYaGFsYnRjODgxMmExYW50X1NwZWNpYWxQYWNrZXROb3RpZnkoCgkgCVBCVENfQ09FWElTVAkJCWJ0Y29leGlzdCwKCSAJdTFCeXRlCQkJCXR5cGUKCSkKewoJQk9PTEVBTiAJYlNlY3VyaXR5TGluaz1mYWxzZTsKCglpZihidGNvZXhpc3QtPm1hbnVhbF9jb250cm9sIHx8YnRjb2V4aXN0LT5zdG9wX2NvZXhfZG0pCgkJcmV0dXJuOwoKCS8vaWYodHlwZSA9PSBCVENfUEFDS0VUX0RIQ1ApCgl7CgkJQlRDX1BSSU5UKEJUQ19NU0dfSU5URVJGQUNFLCBJTlRGX05PVElGWSwgKCJbQlRDb2V4XSwgc3BlY2lhbCBQYWNrZXQoJWQpIG5vdGlmeVxuIiwgdHlwZSkpOwoJCWlmKGJ0Y29leGlzdC0+YnRfaW5mby5idF9kaXNhYmxlZCkKCQl7CgkJCWhhbGJ0Yzg4MTJhMWFudF9Qc1RkbWFDaGVja0ZvclBvd2VyU2F2ZVN0YXRlKGJ0Y29leGlzdCwgZmFsc2UpOwoJCQlidGNvZXhpc3QtPmJ0Y19zZXQoYnRjb2V4aXN0LCBCVENfU0VUX0FDVF9MRUFWRV9MUFMsIE5VTEwpOwoJCQloYWxidGM4ODEyYTFhbnRfUHNUZG1hKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIGZhbHNlLCA5KTsJCgkJfQoJCWVsc2UKCQl7CgkJCWhhbGJ0Yzg4MTJhMWFudF9BY3Rpb25XaWZpQ29ubmVjdGVkU3BlY2lhbFBhY2tldChidGNvZXhpc3QpOwoJCX0KCX0KfQoKdm9pZApFWGhhbGJ0Yzg4MTJhMWFudF9CdEluZm9Ob3RpZnkoCgkgCVBCVENfQ09FWElTVAkJYnRjb2V4aXN0LAoJIAlwdTFCeXRlCQkJdG1wX2J1ZiwKCSAJdTFCeXRlCQkJbGVuZ3RoCgkpCnsKCXUxQnl0ZQkJCWJ0X2luZm89MDsKCXUxQnl0ZQkJCWksIHJzcF9zb3VyY2U9MDsKCXN0YXRpYyB1NEJ5dGUJCXNldF9idF9sbmFfY250PTAsIHNldF9idF9wc2RfbW9kZT0wOwoJQk9PTEVBTgkJCWJ0X2J1c3k9ZmFsc2UsIGxpbWl0ZWRfZGlnPWZhbHNlOwoJQk9PTEVBTgkJCXdpZmlfY29ubmVjdGVkPWZhbHNlOwoJQk9PTEVBTgkJCWJSZWpBcEFnZ1BrdD1mYWxzZTsKCglCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIEJ0SW5mb05vdGlmeSgpPT09PlxuIikpOwoKCglyc3Bfc291cmNlID0gdG1wX2J1ZlswXSYweGY7CglpZihyc3Bfc291cmNlID49IEJUX0lORk9fU1JDXzg4MTJBXzFBTlRfTUFYKQoJCXJzcF9zb3VyY2UgPSBCVF9JTkZPX1NSQ184ODEyQV8xQU5UX1dJRklfRlc7Cgljb2V4X3N0YS0+YnRfaW5mb19jMmhfY250W3JzcF9zb3VyY2VdKys7CgoJQlRDX1BSSU5UKEJUQ19NU0dfSU5URVJGQUNFLCBJTlRGX05PVElGWSwgKCJbQlRDb2V4XSwgQnQgaW5mb1slZF0sIGxlbmd0aD0lZCwgaGV4IGRhdGE9WyIsIHJzcF9zb3VyY2UsIGxlbmd0aCkpOwoJZm9yKGk9MDsgaTxsZW5ndGg7IGkrKykKCXsKCQljb2V4X3N0YS0+YnRfaW5mb19jMmhbcnNwX3NvdXJjZV1baV0gPSB0bXBfYnVmW2ldOwoJCWlmKGkgPT0gMSkKCQkJYnRfaW5mbyA9IHRtcF9idWZbaV07CgkJaWYoaSA9PSBsZW5ndGgtMSkKCQl7CgkJCUJUQ19QUklOVChCVENfTVNHX0lOVEVSRkFDRSwgSU5URl9OT1RJRlksICgiMHglMnhdXG4iLCB0bXBfYnVmW2ldKSk7CgkJfQoJCWVsc2UKCQl7CgkJCUJUQ19QUklOVChCVENfTVNHX0lOVEVSRkFDRSwgSU5URl9OT1RJRlksICgiMHglMngsICIsIHRtcF9idWZbaV0pKTsKCQl9Cgl9CgoJaWYoYnRjb2V4aXN0LT5tYW51YWxfY29udHJvbCkKCXsKCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIEJ0SW5mb05vdGlmeSgpLCByZXR1cm4gZm9yIE1hbnVhbCBDVFJMPD09PVxuIikpOwoJCXJldHVybjsKCX0KCWlmKGJ0Y29leGlzdC0+c3RvcF9jb2V4X2RtKQoJewoJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgQnRJbmZvTm90aWZ5KCksIHJldHVybiBmb3IgQ29leCBTVE9QUEVEISE8PT09XG4iKSk7CgkJcmV0dXJuOwoJfQoKCWlmKEJUX0lORk9fU1JDXzg4MTJBXzFBTlRfV0lGSV9GVyAhPSByc3Bfc291cmNlKQoJewoJCWNvZXhfc3RhLT5idF9yZXRyeV9jbnQgPQoJCQljb2V4X3N0YS0+YnRfaW5mb19jMmhbcnNwX3NvdXJjZV1bMl07CgoJCWNvZXhfc3RhLT5idF9yc3NpID0KCQkJY29leF9zdGEtPmJ0X2luZm9fYzJoW3JzcF9zb3VyY2VdWzNdKjIrMTA7CgoJCWNvZXhfc3RhLT5idF9pbmZvX2V4dCA9IAoJCQljb2V4X3N0YS0+YnRfaW5mb19jMmhbcnNwX3NvdXJjZV1bNF07CgoJCS8vIEhlcmUgd2UgbmVlZCB0byByZXNlbmQgc29tZSB3aWZpIGluZm8gdG8gQlQKCQkvLyBiZWNhdXNlIGJ0IGlzIHJlc2V0IGFuZCBsb3NzIG9mIHRoZSBpbmZvLgoJCWlmKCAoY29leF9zdGEtPmJ0X2luZm9fZXh0ICYgQklUMSkgKQoJCXsJCQkKCQkJYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwgQlRDX0dFVF9CTF9XSUZJX0NPTk5FQ1RFRCwgJndpZmlfY29ubmVjdGVkKTsKCQkJaWYod2lmaV9jb25uZWN0ZWQpCgkJCXsKCQkJCUVYaGFsYnRjODgxMmExYW50X01lZGlhU3RhdHVzTm90aWZ5KGJ0Y29leGlzdCwgQlRDX01FRElBX0NPTk5FQ1QpOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJRVhoYWxidGM4ODEyYTFhbnRfTWVkaWFTdGF0dXNOb3RpZnkoYnRjb2V4aXN0LCBCVENfTUVESUFfRElTQ09OTkVDVCk7CgkJCX0KCgkJCXNldF9idF9wc2RfbW9kZSA9IDA7CgkJfQoKCQkvLyB0ZXN0LWNoaXAgYnQgcGF0Y2ggZG9lc24ndCBzdXBwb3J0LCB0ZW1wb3JhcnkgcmVtb3ZlLgoJCS8vIG5lZWQgdG8gYWRkIGJhY2sgd2hlbiBtcC1jaGlwLiAxMi8yMC8yMDEyCiNpZiAwCQkKCQlpZihzZXRfYnRfcHNkX21vZGUgPD0gMykKCQl7DQoJCQloYWxidGM4ODEyYTFhbnRfU2V0QnRQc2RNb2RlKGJ0Y29leGlzdCwgRk9SQ0VfRVhFQywgMHhkKTsKCQkJc2V0X2J0X3BzZF9tb2RlKys7CgkJfQoJCQoJCWlmKGNvZXhfZG0tPmJDdXJCdExuYUNvbnN0cmFpbikKCQl7CgkJCWlmKCAoY29leF9zdGEtPmJ0X2luZm9fZXh0ICYgQklUMikgKQoJCQl7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlpZihzZXRfYnRfbG5hX2NudCA8PSAzKQoJCQkJewoJCQkJCWhhbGJ0Yzg4MTJhMWFudF9TZXRCdExuYUNvbnN0cmFpbihidGNvZXhpc3QsIEZPUkNFX0VYRUMsIHRydWUpOwoJCQkJCXNldF9idF9sbmFfY250Kys7CgkJCQl9CgkJCX0KCQl9CgkJZWxzZQoJCXsKCQkJc2V0X2J0X2xuYV9jbnQgPSAwOwoJCX0KI2VuZGlmCgkJLy8gdGVzdC1jaGlwIGJ0IHBhdGNoIG9ubHkgcnNwIHRoZSBzdGF0dXMgZm9yIEJUX1JTUCwgCgkJLy8gc28gdGVtcG9yYXJ5IHdlIGNvbnNpZGVyIHRoZSBmb2xsb3dpbmcgb25seSB1bmRlciBCVF9SU1AKCQlpZihCVF9JTkZPX1NSQ184ODEyQV8xQU5UX0JUX1JTUCA9PSByc3Bfc291cmNlKQoJCXsKCQkJaWYoIChjb2V4X3N0YS0+YnRfaW5mb19leHQgJiBCSVQzKSApCgkJCXsKCQkJI2lmIDAvLyB0ZW1wIGRpc2FibGUgYmVjYXVzZSBidCBwYXRjaCByZXBvcnQgdGhlIHdyb25nIHZhbHVlLgoJCQkJaGFsYnRjODgxMmExYW50X0lnbm9yZVdsYW5BY3QoYnRjb2V4aXN0LCBGT1JDRV9FWEVDLCBmYWxzZSk7CgkJCSNlbmRpZgoJCQl9CgkJCWVsc2UKCQkJewoJCQkJLy8gQlQgYWxyZWFkeSBOT1QgaWdub3JlIFdsYW4gYWN0aXZlLCBkbyBub3RoaW5nIGhlcmUuCgkJCX0KCgkJCWlmKCAoY29leF9zdGEtPmJ0X2luZm9fZXh0ICYgQklUNCkgKQoJCQl7CgkJCQkvLyBCVCBhdXRvIHJlcG9ydCBhbHJlYWR5IGVuYWJsZWQsIGRvIG5vdGhpbmcKCQkJfQoJCQllbHNlCgkJCXsKCQkJCWhhbGJ0Yzg4MTJhMWFudF9CdEF1dG9SZXBvcnQoYnRjb2V4aXN0LCBGT1JDRV9FWEVDLCB0cnVlKTsKCQkJfQoJCX0KCX0KCQkKCS8vIGNoZWNrIEJJVDIgZmlyc3QgPT0+IGNoZWNrIGlmIGJ0IGlzIHVuZGVyIGlucXVpcnkgb3IgcGFnZSBzY2FuCglpZihidF9pbmZvICYgQlRfSU5GT184ODEyQV8xQU5UX0JfSU5RX1BBR0UpCgl7CgkJY29leF9zdGEtPmMyaF9idF9pbnF1aXJ5X3BhZ2UgPSB0cnVlOwoJCWNvZXhfZG0tPmJ0X3N0YXR1cyA9IEJUXzg4MTJBXzFBTlRfQlRfU1RBVFVTX0lOUV9QQUdFOwoJfQoJZWxzZQoJewoJCWNvZXhfc3RhLT5jMmhfYnRfaW5xdWlyeV9wYWdlID0gZmFsc2U7CgkJaWYoIShidF9pbmZvJkJUX0lORk9fODgxMkFfMUFOVF9CX0NPTk5FQ1RJT04pKQoJCXsKCQkJY29leF9kbS0+YnRfc3RhdHVzID0gQlRfODgxMkFfMUFOVF9CVF9TVEFUVVNfTk9OX0NPTk5FQ1RFRF9JRExFOwoJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIEJ0SW5mb05vdGlmeSgpLCBidCBub24tY29ubmVjdGVkIGlkbGUhISFcbiIpKTsKCQl9CgkJZWxzZSBpZihidF9pbmZvID09IEJUX0lORk9fODgxMkFfMUFOVF9CX0NPTk5FQ1RJT04pCS8vIGNvbm5lY3Rpb24gZXhpc3RzIGJ1dCBubyBidXN5CgkJewoJCQljb2V4X2RtLT5idF9zdGF0dXMgPSBCVF84ODEyQV8xQU5UX0JUX1NUQVRVU19DT05ORUNURURfSURMRTsKCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBCdEluZm9Ob3RpZnkoKSwgYnQgY29ubmVjdGVkLWlkbGUhISFcbiIpKTsKCQl9CQkKCQllbHNlIGlmKChidF9pbmZvJkJUX0lORk9fODgxMkFfMUFOVF9CX1NDT19FU0NPKSB8fAoJCQkoYnRfaW5mbyZCVF9JTkZPXzg4MTJBXzFBTlRfQl9TQ09fQlVTWSkpCgkJewoJCQljb2V4X2RtLT5idF9zdGF0dXMgPSBCVF84ODEyQV8xQU5UX0JUX1NUQVRVU19TQ09fQlVTWTsKCQkJYlJlakFwQWdnUGt0ID0gdHJ1ZTsKCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBCdEluZm9Ob3RpZnkoKSwgYnQgc2NvIGJ1c3khISFcbiIpKTsKCQl9CgkJZWxzZSBpZihidF9pbmZvJkJUX0lORk9fODgxMkFfMUFOVF9CX0FDTF9CVVNZKQoJCXsKCQkJaWYoQlRfODgxMkFfMUFOVF9CVF9TVEFUVVNfQUNMX0JVU1kgIT0gY29leF9kbS0+YnRfc3RhdHVzKQoJCQkJY29leF9kbS0+cmVzZXRfdGRtYV9hZGp1c3QgPSB0cnVlOwoJCQljb2V4X2RtLT5idF9zdGF0dXMgPSBCVF84ODEyQV8xQU5UX0JUX1NUQVRVU19BQ0xfQlVTWTsKCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBCdEluZm9Ob3RpZnkoKSwgYnQgYWNsIGJ1c3khISFcbiIpKTsKCQl9CiNpZiAwCgkJZWxzZSBpZihidF9pbmZvJkJUX0lORk9fODgxMkFfMUFOVF9CX1NDT19FU0NPKQoJCXsKCQkJY29leF9kbS0+YnRfc3RhdHVzID0gQlRfODgxMkFfMUFOVF9CVF9TVEFUVVNfQUNMX1NDT19CVVNZOwoJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIEJ0SW5mb05vdGlmeSgpLCBidCBhY2wvc2NvIGJ1c3khISFcbiIpKTsKCQl9CiNlbmRpZgoJCWVsc2UKCQl7CgkJCS8vRGJnUHJpbnQoImVycm9yLCB1bmRlZmluZWQgYnRfaW5mbz0weCV4XG4iLCBidF9pbmZvKTsKCQkJY29leF9kbS0+YnRfc3RhdHVzID0gQlRfODgxMkFfMUFOVF9CVF9TVEFUVVNfTUFYOwoJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIEJ0SW5mb05vdGlmeSgpLCBidCBub24tZGVmaW5lZCBzdGF0ZSEhIVxuIikpOwoJCX0KCgkJLy8gc2VuZCBkZWxldGUgQkEgdG8gZGlzYWJsZSBhZ2dyZWdhdGlvbgoJCS8vYnRjb2V4aXN0LT5idGNfc2V0KGJ0Y29leGlzdCwgQlRDX1NFVF9CTF9UT19SRUpfQVBfQUdHX1BLVCwgJmJSZWpBcEFnZ1BrdCk7Cgl9CgoJaWYoIChCVF84ODEyQV8xQU5UX0JUX1NUQVRVU19BQ0xfQlVTWSA9PSBjb2V4X2RtLT5idF9zdGF0dXMpIHx8CgkJKEJUXzg4MTJBXzFBTlRfQlRfU1RBVFVTX1NDT19CVVNZID09IGNvZXhfZG0tPmJ0X3N0YXR1cykgfHwKCQkoQlRfODgxMkFfMUFOVF9CVF9TVEFUVVNfQUNMX1NDT19CVVNZID09IGNvZXhfZG0tPmJ0X3N0YXR1cykgKQoJewoJCWJ0X2J1c3kgPSB0cnVlOwoJfQoJZWxzZQoJewoJCWJ0X2J1c3kgPSBmYWxzZTsKCX0KCWJ0Y29leGlzdC0+YnRjX3NldChidGNvZXhpc3QsIEJUQ19TRVRfQkxfQlRfVFJBRkZJQ19CVVNZLCAmYnRfYnVzeSk7CgoJaWYoYnRfYnVzeSkKCXsKCQlsaW1pdGVkX2RpZyA9IHRydWU7Cgl9CgllbHNlCgl7CgkJbGltaXRlZF9kaWcgPSBmYWxzZTsKCX0KCWNvZXhfZG0tPmxpbWl0ZWRfZGlnID0gbGltaXRlZF9kaWc7CglidGNvZXhpc3QtPmJ0Y19zZXQoYnRjb2V4aXN0LCBCVENfU0VUX0JMX0JUX0xJTUlURURfRElHLCAmbGltaXRlZF9kaWcpOwoKCWhhbGJ0Yzg4MTJhMWFudF9SdW5Db2V4aXN0TWVjaGFuaXNtKGJ0Y29leGlzdCk7CglCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIEJ0SW5mb05vdGlmeSgpPD09PVxuIikpOwp9Cgp2b2lkCkVYaGFsYnRjODgxMmExYW50X1N0YWNrT3BlcmF0aW9uTm90aWZ5KAoJIAlQQlRDX0NPRVhJU1QJCQlidGNvZXhpc3QsCgkgCXUxQnl0ZQkJCQl0eXBlCgkpCnsKCWlmKEJUQ19TVEFDS19PUF9JTlFfUEFHRV9QQUlSX1NUQVJUID09IHR5cGUpCgl7CgkJQlRDX1BSSU5UKEJUQ19NU0dfSU5URVJGQUNFLCBJTlRGX05PVElGWSwgKCJbQlRDb2V4XSwgU3RhY2tPUCBJbnF1aXJ5L3BhZ2UvcGFpciBzdGFydCBub3RpZnlcbiIpKTsKCX0KCWVsc2UgaWYoQlRDX1NUQUNLX09QX0lOUV9QQUdFX1BBSVJfRklOSVNIID09IHR5cGUpCgl7CgkJQlRDX1BSSU5UKEJUQ19NU0dfSU5URVJGQUNFLCBJTlRGX05PVElGWSwgKCJbQlRDb2V4XSwgU3RhY2tPUCBJbnF1aXJ5L3BhZ2UvcGFpciBmaW5pc2ggbm90aWZ5XG4iKSk7Cgl9Cn0KCnZvaWQKRVhoYWxidGM4ODEyYTFhbnRfSGFsdE5vdGlmeSgKCSAJUEJUQ19DT0VYSVNUCQkJYnRjb2V4aXN0CgkpCnsKCUJUQ19QUklOVChCVENfTVNHX0lOVEVSRkFDRSwgSU5URl9OT1RJRlksICgiW0JUQ29leF0sIEhhbHQgbm90aWZ5XG4iKSk7CgoJaGFsYnRjODgxMmExYW50X0lnbm9yZVdsYW5BY3QoYnRjb2V4aXN0LCBGT1JDRV9FWEVDLCB0cnVlKTsKCWhhbGJ0Yzg4MTJhMWFudF9Qc1RkbWEoYnRjb2V4aXN0LCBGT1JDRV9FWEVDLCBmYWxzZSwgMCk7CglidGNvZXhpc3QtPmJ0Y193cml0ZV8xYnl0ZShidGNvZXhpc3QsIDB4NGYsIDB4Zik7CgloYWxidGM4ODEyYTFhbnRfV2lmaVBhcmFBZGp1c3QoYnRjb2V4aXN0LCBmYWxzZSk7Cn0KCnZvaWQKRVhoYWxidGM4ODEyYTFhbnRfUG5wTm90aWZ5KAoJIAlQQlRDX0NPRVhJU1QJCQlidGNvZXhpc3QsCgkgCXUxQnl0ZQkJCQlwbnBTdGF0ZQoJKQp7CglCVENfUFJJTlQoQlRDX01TR19JTlRFUkZBQ0UsIElOVEZfTk9USUZZLCAoIltCVENvZXhdLCBQbnAgbm90aWZ5XG4iKSk7CgoJaWYoQlRDX1dJRklfUE5QX1NMRUVQID09IHBucFN0YXRlKQoJewoJCWJ0Y29leGlzdC0+c3RvcF9jb2V4X2RtID0gdHJ1ZTsKCQloYWxidGM4ODEyYTFhbnRfSWdub3JlV2xhbkFjdChidGNvZXhpc3QsIEZPUkNFX0VYRUMsIHRydWUpOwoJCWhhbGJ0Yzg4MTJhMWFudF9Qc1RkbWFDaGVja0ZvclBvd2VyU2F2ZVN0YXRlKGJ0Y29leGlzdCwgZmFsc2UpOwoJCWJ0Y29leGlzdC0+YnRjX3NldChidGNvZXhpc3QsIEJUQ19TRVRfQUNUX0xFQVZFX0xQUywgTlVMTCk7CgkJaGFsYnRjODgxMmExYW50X1BzVGRtYShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCBmYWxzZSwgOSk7CQoJfQoJZWxzZSBpZihCVENfV0lGSV9QTlBfV0FLRV9VUCA9PSBwbnBTdGF0ZSkKCXsKCQkKCX0KfQoKdm9pZApFWGhhbGJ0Yzg4MTJhMWFudF9QZXJpb2RpY2FsKAoJIAlQQlRDX0NPRVhJU1QJCQlidGNvZXhpc3QKCSkKewoJQk9PTEVBTgkJCXdpZmlfdW5kZXI1Zz1mYWxzZTsKCglCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIFBlcmlvZGljYWwoKT09PT5cbiIpKTsKCUJUQ19QUklOVChCVENfTVNHX0lOVEVSRkFDRSwgSU5URl9OT1RJRlksICgiW0JUQ29leF0sIDFBbnQgUGVyaW9kaWNhbCEhXG4iKSk7CgoJYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwgQlRDX0dFVF9CTF9XSUZJX1VOREVSXzVHLCAmd2lmaV91bmRlcjVnKTsKCglpZih3aWZpX3VuZGVyNWcpCgl7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBQZXJpb2RpY2FsKCksIHJldHVybiBmb3IgNUc8PT09XG4iKSk7CgkJaGFsYnRjODgxMmExYW50X0NvZXhBbGxPZmYoYnRjb2V4aXN0KTsKCQlyZXR1cm47Cgl9CgoJaGFsYnRjODgxMmExYW50X1F1ZXJ5QnRJbmZvKGJ0Y29leGlzdCk7CgloYWxidGM4ODEyYTFhbnRfTW9uaXRvckJ0Q3RyKGJ0Y29leGlzdCk7CgloYWxidGM4ODEyYTFhbnRfTW9uaXRvckJ0RW5hYmxlRGlzYWJsZShidGNvZXhpc3QpOwoJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBQZXJpb2RpY2FsKCk8PT09XG4iKSk7Cn0KCnZvaWQKRVhoYWxidGM4ODEyYTFhbnRfRGJnQ29udHJvbCgKCSAJUEJUQ19DT0VYSVNUCQkJYnRjb2V4aXN0LAoJIAl1MUJ5dGUJCQkJb3BDb2RlLAoJIAl1MUJ5dGUJCQkJb3BMZW4sCgkgCXB1MUJ5dGUJCQkJcERhdGEKCSkKewoJc3dpdGNoKG9wQ29kZSkKCXsKCQljYXNlIEJUQ19EQkdfU0VUX0NPRVhfTk9STUFMOgoJCQlidGNvZXhpc3QtPm1hbnVhbF9jb250cm9sID0gZmFsc2U7CgkJCWhhbGJ0Yzg4MTJhMWFudF9Jbml0Q29leERtKGJ0Y29leGlzdCk7CgkJCWJyZWFrOwoJCWNhc2UgQlRDX0RCR19TRVRfQ09FWF9XSUZJX09OTFk6CgkJCWJ0Y29leGlzdC0+bWFudWFsX2NvbnRyb2wgPSB0cnVlOwoJCQloYWxidGM4ODEyYTFhbnRfUHNUZG1hQ2hlY2tGb3JQb3dlclNhdmVTdGF0ZShidGNvZXhpc3QsIGZhbHNlKTsKCQkJYnRjb2V4aXN0LT5idGNfc2V0KGJ0Y29leGlzdCwgQlRDX1NFVF9BQ1RfTEVBVkVfTFBTLCBOVUxMKTsKCQkJaGFsYnRjODgxMmExYW50X1BzVGRtYShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCBmYWxzZSwgOSk7CQoJCQlicmVhazsKCQljYXNlIEJUQ19EQkdfU0VUX0NPRVhfQlRfT05MWToKCQkJLy8gdG9kbwoJCQlicmVhazsKCQlkZWZhdWx0OgoJCQlicmVhazsKCX0KfQojZW5kaWYKCg==