LyoKICogIGxpbnV4L2ZzL3N1cGVyLmMKICoKICogIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiAgTGludXMgVG9ydmFsZHMKICoKICogIHN1cGVyLmMgY29udGFpbnMgY29kZSB0byBoYW5kbGU6IC0gbW91bnQgc3RydWN0dXJlcwogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBzdXBlci1ibG9jayB0YWJsZXMKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gZmlsZXN5c3RlbSBkcml2ZXJzIGxpc3QKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gbW91bnQgc3lzdGVtIGNhbGwKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gdW1vdW50IHN5c3RlbSBjYWxsCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHVzdGF0IHN5c3RlbSBjYWxsCiAqCiAqIEdLIDIvNS85NSAgLSAgQ2hhbmdlZCB0byBzdXBwb3J0IG1vdW50aW5nIHRoZSByb290IGZzIHZpYSBORlMKICoKICogIEFkZGVkIGtlcm5lbGQgc3VwcG9ydDogSmFjcXVlcyBHZWxpbmFzIGFuZCBCam9ybiBFa3dhbGwKICogIEFkZGVkIGNoYW5nZV9yb290OiBXZXJuZXIgQWxtZXNiZXJnZXIgJiBIYW5zIExlcm1lbiwgRmViICc5NgogKiAgQWRkZWQgb3B0aW9ucyB0byAvcHJvYy9tb3VudHM6CiAqICAgIFRvcmJq9nJuIExpbmRoICh0b3Jiam9ybi5saW5kaEBnb3B0YS5zZSksIEFwcmlsIDE0LCAxOTk2LgogKiAgQWRkZWQgZGV2ZnMgc3VwcG9ydDogUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+LCAxMy1KQU4tMTk5OAogKiAgSGVhdmlseSByZXdyaXR0ZW4gZm9yICdvbmUgZnMgLSBvbmUgdHJlZScgZGNhY2hlIGFyY2hpdGVjdHVyZS4gQVYsIE1hciAyMDAwCiAqLwoKI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgojaW5jbHVkZSA8bGludXgvc2xhYi5oPgojaW5jbHVkZSA8bGludXgvaW5pdC5oPgojaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KI2luY2x1ZGUgPGxpbnV4L2FjY3QuaD4KI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgojaW5jbHVkZSA8bGludXgvcXVvdGFvcHMuaD4KI2luY2x1ZGUgPGxpbnV4L25hbWVpLmg+CiNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgkJLyogZm9yIGZzeW5jX3N1cGVyKCkgKi8KI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CiNpbmNsdWRlIDxsaW51eC9zZWN1cml0eS5oPgojaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KI2luY2x1ZGUgPGxpbnV4L3Zmcy5oPgojaW5jbHVkZSA8bGludXgvd3JpdGViYWNrLmg+CQkvKiBmb3IgdGhlIGVtZXJnZW5jeSByZW1vdW50IHN0dWZmICovCiNpbmNsdWRlIDxsaW51eC9pZHIuaD4KI2luY2x1ZGUgPGxpbnV4L2tvYmplY3QuaD4KI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgoKCnZvaWQgZ2V0X2ZpbGVzeXN0ZW0oc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzKTsKdm9pZCBwdXRfZmlsZXN5c3RlbShzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnMpOwpzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZ2V0X2ZzX3R5cGUoY29uc3QgY2hhciAqbmFtZSk7CgpMSVNUX0hFQUQoc3VwZXJfYmxvY2tzKTsKREVGSU5FX1NQSU5MT0NLKHNiX2xvY2spOwoKLyoqCiAqCWFsbG9jX3N1cGVyCS0JY3JlYXRlIG5ldyBzdXBlcmJsb2NrCiAqCUB0eXBlOglmaWxlc3lzdGVtIHR5cGUgc3VwZXJibG9jayBzaG91bGQgYmVsb25nIHRvCiAqCiAqCUFsbG9jYXRlcyBhbmQgaW5pdGlhbGl6ZXMgYSBuZXcgJnN0cnVjdCBzdXBlcl9ibG9jay4gIGFsbG9jX3N1cGVyKCkKICoJcmV0dXJucyBhIHBvaW50ZXIgbmV3IHN1cGVyYmxvY2sgb3IgJU5VTEwgaWYgYWxsb2NhdGlvbiBoYWQgZmFpbGVkLgogKi8Kc3RhdGljIHN0cnVjdCBzdXBlcl9ibG9jayAqYWxsb2Nfc3VwZXIoc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKnR5cGUpCnsKCXN0cnVjdCBzdXBlcl9ibG9jayAqcyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzdXBlcl9ibG9jayksICBHRlBfVVNFUik7CglzdGF0aWMgc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgZGVmYXVsdF9vcDsKCglpZiAocykgewoJCWlmIChzZWN1cml0eV9zYl9hbGxvYyhzKSkgewoJCQlrZnJlZShzKTsKCQkJcyA9IE5VTEw7CgkJCWdvdG8gb3V0OwoJCX0KCQlJTklUX0xJU1RfSEVBRCgmcy0+c19kaXJ0eSk7CgkJSU5JVF9MSVNUX0hFQUQoJnMtPnNfaW8pOwoJCUlOSVRfTElTVF9IRUFEKCZzLT5zX2ZpbGVzKTsKCQlJTklUX0xJU1RfSEVBRCgmcy0+c19pbnN0YW5jZXMpOwoJCUlOSVRfSExJU1RfSEVBRCgmcy0+c19hbm9uKTsKCQlJTklUX0xJU1RfSEVBRCgmcy0+c19pbm9kZXMpOwoJCWluaXRfcndzZW0oJnMtPnNfdW1vdW50KTsKCQltdXRleF9pbml0KCZzLT5zX2xvY2spOwoJCWxvY2tkZXBfc2V0X2NsYXNzKCZzLT5zX3Vtb3VudCwgJnR5cGUtPnNfdW1vdW50X2tleSk7CgkJLyoKCQkgKiBUaGUgbG9ja2luZyBydWxlcyBmb3Igc19sb2NrIGFyZSB1cCB0byB0aGUKCQkgKiBmaWxlc3lzdGVtLiBGb3IgZXhhbXBsZSBleHQzZnMgaGFzIGRpZmZlcmVudAoJCSAqIGxvY2sgb3JkZXJpbmcgdGhhbiB1c2JmczoKCQkgKi8KCQlsb2NrZGVwX3NldF9jbGFzcygmcy0+c19sb2NrLCAmdHlwZS0+c19sb2NrX2tleSk7CgkJZG93bl93cml0ZSgmcy0+c191bW91bnQpOwoJCXMtPnNfY291bnQgPSBTX0JJQVM7CgkJYXRvbWljX3NldCgmcy0+c19hY3RpdmUsIDEpOwoJCW11dGV4X2luaXQoJnMtPnNfdmZzX3JlbmFtZV9tdXRleCk7CgkJbXV0ZXhfaW5pdCgmcy0+c19kcXVvdC5kcWlvX211dGV4KTsKCQltdXRleF9pbml0KCZzLT5zX2RxdW90LmRxb25vZmZfbXV0ZXgpOwoJCWluaXRfcndzZW0oJnMtPnNfZHF1b3QuZHFwdHJfc2VtKTsKCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzLT5zX3dhaXRfdW5mcm96ZW4pOwoJCXMtPnNfbWF4Ynl0ZXMgPSBNQVhfTk9OX0xGUzsKCQlzLT5kcV9vcCA9IHNiX2RxdW90X29wczsKCQlzLT5zX3Fjb3AgPSBzYl9xdW90YWN0bF9vcHM7CgkJcy0+c19vcCA9ICZkZWZhdWx0X29wOwoJCXMtPnNfdGltZV9ncmFuID0gMTAwMDAwMDAwMDsKCX0Kb3V0OgoJcmV0dXJuIHM7Cn0KCi8qKgogKglkZXN0cm95X3N1cGVyCS0JZnJlZXMgYSBzdXBlcmJsb2NrCiAqCUBzOiBzdXBlcmJsb2NrIHRvIGZyZWUKICoKICoJRnJlZXMgYSBzdXBlcmJsb2NrLgogKi8Kc3RhdGljIGlubGluZSB2b2lkIGRlc3Ryb3lfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzKQp7CglzZWN1cml0eV9zYl9mcmVlKHMpOwoJa2ZyZWUocyk7Cn0KCi8qIFN1cGVyYmxvY2sgcmVmY291bnRpbmcgICovCgovKgogKiBEcm9wIGEgc3VwZXJibG9jaydzIHJlZmNvdW50LiAgUmV0dXJucyBub24temVybyBpZiB0aGUgc3VwZXJibG9jayB3YXMKICogZGVzdHJveWVkLiAgVGhlIGNhbGxlciBtdXN0IGhvbGQgc2JfbG9jay4KICovCmludCBfX3B1dF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQp7CglpbnQgcmV0ID0gMDsKCglpZiAoIS0tc2ItPnNfY291bnQpIHsKCQlkZXN0cm95X3N1cGVyKHNiKTsKCQlyZXQgPSAxOwoJfQoJcmV0dXJuIHJldDsKfQoKLyoKICogRHJvcCBhIHN1cGVyYmxvY2sncyByZWZjb3VudC4KICogUmV0dXJucyBub24temVybyBpZiB0aGUgc3VwZXJibG9jayBpcyBhYm91dCB0byBiZSBkZXN0cm95ZWQgYW5kCiAqIGF0IGxlYXN0IGlzIGFscmVhZHkgcmVtb3ZlZCBmcm9tIHN1cGVyX2Jsb2NrcyBsaXN0LCBzbyBpZiB3ZSBhcmUKICogbWFraW5nIGEgbG9vcCB0aHJvdWdoIHN1cGVyIGJsb2NrcyB0aGVuIHdlIG5lZWQgdG8gcmVzdGFydC4KICogVGhlIGNhbGxlciBtdXN0IGhvbGQgc2JfbG9jay4KICovCmludCBfX3B1dF9zdXBlcl9hbmRfbmVlZF9yZXN0YXJ0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCnsKCS8qIGNoZWNrIGZvciByYWNlIHdpdGggZ2VuZXJpY19zaHV0ZG93bl9zdXBlcigpICovCglpZiAobGlzdF9lbXB0eSgmc2ItPnNfbGlzdCkpIHsKCQkvKiBzdXBlciBibG9jayBpcyByZW1vdmVkLCBuZWVkIHRvIHJlc3RhcnQuLi4gKi8KCQlfX3B1dF9zdXBlcihzYik7CgkJcmV0dXJuIDE7Cgl9CgkvKiBjYW4ndCBiZSB0aGUgbGFzdCwgc2luY2Ugc19saXN0IGlzIHN0aWxsIGluIHVzZSAqLwoJc2ItPnNfY291bnQtLTsKCUJVR19PTihzYi0+c19jb3VudCA9PSAwKTsKCXJldHVybiAwOwp9CgovKioKICoJcHV0X3N1cGVyCS0JZHJvcCBhIHRlbXBvcmFyeSByZWZlcmVuY2UgdG8gc3VwZXJibG9jawogKglAc2I6IHN1cGVyYmxvY2sgaW4gcXVlc3Rpb24KICoKICoJRHJvcHMgYSB0ZW1wb3JhcnkgcmVmZXJlbmNlLCBmcmVlcyBzdXBlcmJsb2NrIGlmIHRoZXJlJ3Mgbm8KICoJcmVmZXJlbmNlcyBsZWZ0LgogKi8Kc3RhdGljIHZvaWQgcHV0X3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCnsKCXNwaW5fbG9jaygmc2JfbG9jayk7CglfX3B1dF9zdXBlcihzYik7CglzcGluX3VubG9jaygmc2JfbG9jayk7Cn0KCgovKioKICoJZGVhY3RpdmF0ZV9zdXBlcgktCWRyb3AgYW4gYWN0aXZlIHJlZmVyZW5jZSB0byBzdXBlcmJsb2NrCiAqCUBzOiBzdXBlcmJsb2NrIHRvIGRlYWN0aXZhdGUKICoKICoJRHJvcHMgYW4gYWN0aXZlIHJlZmVyZW5jZSB0byBzdXBlcmJsb2NrLCBhY3F1aXJpbmcgYSB0ZW1wcm9yeSBvbmUgaWYKICoJdGhlcmUgaXMgbm8gYWN0aXZlIHJlZmVyZW5jZXMgbGVmdC4gIEluIHRoYXQgY2FzZSB3ZSBsb2NrIHN1cGVyYmxvY2ssCiAqCXRlbGwgZnMgZHJpdmVyIHRvIHNodXQgaXQgZG93biBhbmQgZHJvcCB0aGUgdGVtcG9yYXJ5IHJlZmVyZW5jZSB3ZQogKgloYWQganVzdCBhY3F1aXJlZC4KICovCnZvaWQgZGVhY3RpdmF0ZV9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMpCnsKCXN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmcyA9IHMtPnNfdHlwZTsKCWlmIChhdG9taWNfZGVjX2FuZF9sb2NrKCZzLT5zX2FjdGl2ZSwgJnNiX2xvY2spKSB7CgkJcy0+c19jb3VudCAtPSBTX0JJQVMtMTsKCQlzcGluX3VubG9jaygmc2JfbG9jayk7CgkJRFFVT1RfT0ZGKHMpOwoJCWRvd25fd3JpdGUoJnMtPnNfdW1vdW50KTsKCQlmcy0+a2lsbF9zYihzKTsKCQlwdXRfZmlsZXN5c3RlbShmcyk7CgkJcHV0X3N1cGVyKHMpOwoJfQp9CgpFWFBPUlRfU1lNQk9MKGRlYWN0aXZhdGVfc3VwZXIpOwoKLyoqCiAqCWdyYWJfc3VwZXIgLSBhY3F1aXJlIGFuIGFjdGl2ZSByZWZlcmVuY2UKICoJQHM6IHJlZmVyZW5jZSB3ZSBhcmUgdHJ5aW5nIHRvIG1ha2UgYWN0aXZlCiAqCiAqCVRyaWVzIHRvIGFjcXVpcmUgYW4gYWN0aXZlIHJlZmVyZW5jZS4gIGdyYWJfc3VwZXIoKSBpcyB1c2VkIHdoZW4gd2UKICogCWhhZCBqdXN0IGZvdW5kIGEgc3VwZXJibG9jayBpbiBzdXBlcl9ibG9ja3Mgb3IgZnNfdHlwZS0+ZnNfc3VwZXJzCiAqCWFuZCB3YW50IHRvIHR1cm4gaXQgaW50byBhIGZ1bGwtYmxvd24gYWN0aXZlIHJlZmVyZW5jZS4gIGdyYWJfc3VwZXIoKQogKglpcyBjYWxsZWQgd2l0aCBzYl9sb2NrIGhlbGQgYW5kIGRyb3BzIGl0LiAgUmV0dXJucyAxIGluIGNhc2Ugb2YKICoJc3VjY2VzcywgMCBpZiB3ZSBoYWQgZmFpbGVkIChzdXBlcmJsb2NrIGNvbnRlbnRzIHdhcyBhbHJlYWR5IGRlYWQgb3IKICoJZHlpbmcgd2hlbiBncmFiX3N1cGVyKCkgaGFkIGJlZW4gY2FsbGVkKS4KICovCnN0YXRpYyBpbnQgZ3JhYl9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMpIF9fcmVsZWFzZXMoc2JfbG9jaykKewoJcy0+c19jb3VudCsrOwoJc3Bpbl91bmxvY2soJnNiX2xvY2spOwoJZG93bl93cml0ZSgmcy0+c191bW91bnQpOwoJaWYgKHMtPnNfcm9vdCkgewoJCXNwaW5fbG9jaygmc2JfbG9jayk7CgkJaWYgKHMtPnNfY291bnQgPiBTX0JJQVMpIHsKCQkJYXRvbWljX2luYygmcy0+c19hY3RpdmUpOwoJCQlzLT5zX2NvdW50LS07CgkJCXNwaW5fdW5sb2NrKCZzYl9sb2NrKTsKCQkJcmV0dXJuIDE7CgkJfQoJCXNwaW5fdW5sb2NrKCZzYl9sb2NrKTsKCX0KCXVwX3dyaXRlKCZzLT5zX3Vtb3VudCk7CglwdXRfc3VwZXIocyk7Cgl5aWVsZCgpOwoJcmV0dXJuIDA7Cn0KCi8qCiAqIFdyaXRlIG91dCBhbmQgd2FpdCB1cG9uIGFsbCBkaXJ0eSBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGlzCiAqIHN1cGVyYmxvY2suICBGaWxlc3lzdGVtIGRhdGEgYXMgd2VsbCBhcyB0aGUgdW5kZXJseWluZyBibG9jawogKiBkZXZpY2UuICBUYWtlcyB0aGUgc3VwZXJibG9jayBsb2NrLiAgUmVxdWlyZXMgYSBzZWNvbmQgYmxrZGV2CiAqIGZsdXNoIGJ5IHRoZSBjYWxsZXIgdG8gY29tcGxldGUgdGhlIG9wZXJhdGlvbi4KICovCnZvaWQgX19mc3luY19zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQp7CglzeW5jX2lub2Rlc19zYihzYiwgMCk7CglEUVVPVF9TWU5DKHNiKTsKCWxvY2tfc3VwZXIoc2IpOwoJaWYgKHNiLT5zX2RpcnQgJiYgc2ItPnNfb3AtPndyaXRlX3N1cGVyKQoJCXNiLT5zX29wLT53cml0ZV9zdXBlcihzYik7Cgl1bmxvY2tfc3VwZXIoc2IpOwoJaWYgKHNiLT5zX29wLT5zeW5jX2ZzKQoJCXNiLT5zX29wLT5zeW5jX2ZzKHNiLCAxKTsKCXN5bmNfYmxvY2tkZXYoc2ItPnNfYmRldik7CglzeW5jX2lub2Rlc19zYihzYiwgMSk7Cn0KCi8qCiAqIFdyaXRlIG91dCBhbmQgd2FpdCB1cG9uIGFsbCBkaXJ0eSBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGlzCiAqIHN1cGVyYmxvY2suICBGaWxlc3lzdGVtIGRhdGEgYXMgd2VsbCBhcyB0aGUgdW5kZXJseWluZyBibG9jawogKiBkZXZpY2UuICBUYWtlcyB0aGUgc3VwZXJibG9jayBsb2NrLgogKi8KaW50IGZzeW5jX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCnsKCV9fZnN5bmNfc3VwZXIoc2IpOwoJcmV0dXJuIHN5bmNfYmxvY2tkZXYoc2ItPnNfYmRldik7Cn0KCi8qKgogKglnZW5lcmljX3NodXRkb3duX3N1cGVyCS0JY29tbW9uIGhlbHBlciBmb3IgLT5raWxsX3NiKCkKICoJQHNiOiBzdXBlcmJsb2NrIHRvIGtpbGwKICoKICoJZ2VuZXJpY19zaHV0ZG93bl9zdXBlcigpIGRvZXMgYWxsIGZzLWluZGVwZW5kZW50IHdvcmsgb24gc3VwZXJibG9jawogKglzaHV0ZG93bi4gIFR5cGljYWwgLT5raWxsX3NiKCkgc2hvdWxkIHBpY2sgYWxsIGZzLXNwZWNpZmljIG9iamVjdHMKICoJdGhhdCBuZWVkIGRlc3RydWN0aW9uIG91dCBvZiBzdXBlcmJsb2NrLCBjYWxsIGdlbmVyaWNfc2h1dGRvd25fc3VwZXIoKQogKglhbmQgcmVsZWFzZSBhZm9yZW1lbnRpb25lZCBvYmplY3RzLiAgTm90ZTogZGVudHJpZXMgYW5kIGlub2RlcyBfYXJlXwogKgl0YWtlbiBjYXJlIG9mIGFuZCBkbyBub3QgbmVlZCBzcGVjaWZpYyBoYW5kbGluZy4KICovCnZvaWQgZ2VuZXJpY19zaHV0ZG93bl9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQp7CglzdHJ1Y3QgZGVudHJ5ICpyb290ID0gc2ItPnNfcm9vdDsKCXN0cnVjdCBzdXBlcl9vcGVyYXRpb25zICpzb3AgPSBzYi0+c19vcDsKCglpZiAocm9vdCkgewoJCXNiLT5zX3Jvb3QgPSBOVUxMOwoJCXNocmlua19kY2FjaGVfcGFyZW50KHJvb3QpOwoJCXNocmlua19kY2FjaGVfc2Ioc2IpOwoJCWRwdXQocm9vdCk7CgkJZnN5bmNfc3VwZXIoc2IpOwoJCWxvY2tfc3VwZXIoc2IpOwoJCXNiLT5zX2ZsYWdzICY9IH5NU19BQ1RJVkU7CgkJLyogYmFkIG5hbWUgLSBpdCBzaG91bGQgYmUgZXZpY3RfaW5vZGVzKCkgKi8KCQlpbnZhbGlkYXRlX2lub2RlcyhzYik7CgkJbG9ja19rZXJuZWwoKTsKCgkJaWYgKHNvcC0+d3JpdGVfc3VwZXIgJiYgc2ItPnNfZGlydCkKCQkJc29wLT53cml0ZV9zdXBlcihzYik7CgkJaWYgKHNvcC0+cHV0X3N1cGVyKQoJCQlzb3AtPnB1dF9zdXBlcihzYik7CgoJCS8qIEZvcmdldCBhbnkgcmVtYWluaW5nIGlub2RlcyAqLwoJCWlmIChpbnZhbGlkYXRlX2lub2RlcyhzYikpIHsKCQkJcHJpbnRrKCJWRlM6IEJ1c3kgaW5vZGVzIGFmdGVyIHVubW91bnQgb2YgJXMuICIKCQkJICAgIlNlbGYtZGVzdHJ1Y3QgaW4gNSBzZWNvbmRzLiAgSGF2ZSBhIG5pY2UgZGF5Li4uXG4iLAoJCQkgICBzYi0+c19pZCk7CgkJfQoKCQl1bmxvY2tfa2VybmVsKCk7CgkJdW5sb2NrX3N1cGVyKHNiKTsKCX0KCXNwaW5fbG9jaygmc2JfbG9jayk7CgkvKiBzaG91bGQgYmUgaW5pdGlhbGl6ZWQgZm9yIF9fcHV0X3N1cGVyX2FuZF9uZWVkX3Jlc3RhcnQoKSAqLwoJbGlzdF9kZWxfaW5pdCgmc2ItPnNfbGlzdCk7CglsaXN0X2RlbCgmc2ItPnNfaW5zdGFuY2VzKTsKCXNwaW5fdW5sb2NrKCZzYl9sb2NrKTsKCXVwX3dyaXRlKCZzYi0+c191bW91bnQpOwp9CgpFWFBPUlRfU1lNQk9MKGdlbmVyaWNfc2h1dGRvd25fc3VwZXIpOwoKLyoqCiAqCXNnZXQJLQlmaW5kIG9yIGNyZWF0ZSBhIHN1cGVyYmxvY2sKICoJQHR5cGU6CWZpbGVzeXN0ZW0gdHlwZSBzdXBlcmJsb2NrIHNob3VsZCBiZWxvbmcgdG8KICoJQHRlc3Q6CWNvbXBhcmlzb24gY2FsbGJhY2sKICoJQHNldDoJc2V0dXAgY2FsbGJhY2sKICoJQGRhdGE6CWFyZ3VtZW50IHRvIGVhY2ggb2YgdGhlbQogKi8Kc3RydWN0IHN1cGVyX2Jsb2NrICpzZ2V0KHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICp0eXBlLAoJCQlpbnQgKCp0ZXN0KShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKix2b2lkICopLAoJCQlpbnQgKCpzZXQpKHN0cnVjdCBzdXBlcl9ibG9jayAqLHZvaWQgKiksCgkJCXZvaWQgKmRhdGEpCnsKCXN0cnVjdCBzdXBlcl9ibG9jayAqcyA9IE5VTEw7CglzdHJ1Y3QgbGlzdF9oZWFkICpwOwoJaW50IGVycjsKCnJldHJ5OgoJc3Bpbl9sb2NrKCZzYl9sb2NrKTsKCWlmICh0ZXN0KSBsaXN0X2Zvcl9lYWNoKHAsICZ0eXBlLT5mc19zdXBlcnMpIHsKCQlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKm9sZDsKCQlvbGQgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBzdXBlcl9ibG9jaywgc19pbnN0YW5jZXMpOwoJCWlmICghdGVzdChvbGQsIGRhdGEpKQoJCQljb250aW51ZTsKCQlpZiAoIWdyYWJfc3VwZXIob2xkKSkKCQkJZ290byByZXRyeTsKCQlpZiAocykKCQkJZGVzdHJveV9zdXBlcihzKTsKCQlyZXR1cm4gb2xkOwoJfQoJaWYgKCFzKSB7CgkJc3Bpbl91bmxvY2soJnNiX2xvY2spOwoJCXMgPSBhbGxvY19zdXBlcih0eXBlKTsKCQlpZiAoIXMpCgkJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwoJCWdvdG8gcmV0cnk7Cgl9CgkJCgllcnIgPSBzZXQocywgZGF0YSk7CglpZiAoZXJyKSB7CgkJc3Bpbl91bmxvY2soJnNiX2xvY2spOwoJCWRlc3Ryb3lfc3VwZXIocyk7CgkJcmV0dXJuIEVSUl9QVFIoZXJyKTsKCX0KCXMtPnNfdHlwZSA9IHR5cGU7CglzdHJsY3B5KHMtPnNfaWQsIHR5cGUtPm5hbWUsIHNpemVvZihzLT5zX2lkKSk7CglsaXN0X2FkZF90YWlsKCZzLT5zX2xpc3QsICZzdXBlcl9ibG9ja3MpOwoJbGlzdF9hZGQoJnMtPnNfaW5zdGFuY2VzLCAmdHlwZS0+ZnNfc3VwZXJzKTsKCXNwaW5fdW5sb2NrKCZzYl9sb2NrKTsKCWdldF9maWxlc3lzdGVtKHR5cGUpOwoJcmV0dXJuIHM7Cn0KCkVYUE9SVF9TWU1CT0woc2dldCk7Cgp2b2lkIGRyb3Bfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKewoJdXBfcmVhZCgmc2ItPnNfdW1vdW50KTsKCXB1dF9zdXBlcihzYik7Cn0KCkVYUE9SVF9TWU1CT0woZHJvcF9zdXBlcik7CgpzdGF0aWMgaW5saW5lIHZvaWQgd3JpdGVfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKewoJbG9ja19zdXBlcihzYik7CglpZiAoc2ItPnNfcm9vdCAmJiBzYi0+c19kaXJ0KQoJCWlmIChzYi0+c19vcC0+d3JpdGVfc3VwZXIpCgkJCXNiLT5zX29wLT53cml0ZV9zdXBlcihzYik7Cgl1bmxvY2tfc3VwZXIoc2IpOwp9CgovKgogKiBOb3RlOiBjaGVjayB0aGUgZGlydHkgZmxhZyBiZWZvcmUgd2FpdGluZywgc28gd2UgZG9uJ3QKICogaG9sZCB1cCB0aGUgc3luYyB3aGlsZSBtb3VudGluZyBhIGRldmljZS4gKFRoZSBuZXdseQogKiBtb3VudGVkIGRldmljZSB3b24ndCBuZWVkIHN5bmNpbmcuKQogKi8Kdm9pZCBzeW5jX3N1cGVycyh2b2lkKQp7CglzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiOwoKCXNwaW5fbG9jaygmc2JfbG9jayk7CnJlc3RhcnQ6CglsaXN0X2Zvcl9lYWNoX2VudHJ5KHNiLCAmc3VwZXJfYmxvY2tzLCBzX2xpc3QpIHsKCQlpZiAoc2ItPnNfZGlydCkgewoJCQlzYi0+c19jb3VudCsrOwoJCQlzcGluX3VubG9jaygmc2JfbG9jayk7CgkJCWRvd25fcmVhZCgmc2ItPnNfdW1vdW50KTsKCQkJd3JpdGVfc3VwZXIoc2IpOwoJCQl1cF9yZWFkKCZzYi0+c191bW91bnQpOwoJCQlzcGluX2xvY2soJnNiX2xvY2spOwoJCQlpZiAoX19wdXRfc3VwZXJfYW5kX25lZWRfcmVzdGFydChzYikpCgkJCQlnb3RvIHJlc3RhcnQ7CgkJfQoJfQoJc3Bpbl91bmxvY2soJnNiX2xvY2spOwp9CgovKgogKiBDYWxsIHRoZSAtPnN5bmNfZnMgc3VwZXJfb3AgYWdhaW5zdCBhbGwgZmlsZXN5dGVtcyB3aGljaCBhcmUgci93IGFuZAogKiB3aGljaCBpbXBsZW1lbnQgaXQuCiAqCiAqIFRoaXMgb3BlcmF0aW9uIGlzIGNhcmVmdWwgdG8gYXZvaWQgdGhlIGxpdmVsb2NrIHdoaWNoIGNvdWxkIGVhc2lseSBoYXBwZW4KICogaWYgdHdvIG9yIG1vcmUgZmlsZXN5c3RlbXMgYXJlIGJlaW5nIGNvbnRpbnVvdXNseSBkaXJ0aWVkLiAgc19uZWVkX3N5bmNfZnMKICogaXMgdXNlZCBvbmx5IGhlcmUuICBXZSBzZXQgaXQgYWdhaW5zdCBhbGwgZmlsZXN5c3RlbXMgYW5kIHRoZW4gY2xlYXIgaXQgYXMKICogd2Ugc3luYyB0aGVtLiAgU28gcmVkaXJ0aWVkIGZpbGVzeXN0ZW1zIGFyZSBza2lwcGVkLgogKgogKiBCdXQgaWYgcHJvY2VzcyBBIGlzIGN1cnJlbnRseSBydW5uaW5nIHN5bmNfZmlsZXN5dGVtcyBhbmQgdGhlbiBwcm9jZXNzIEIKICogY2FsbHMgc3luY19maWxlc3lzdGVtcyBhcyB3ZWxsLCBwcm9jZXNzIEIgd2lsbCBzZXQgYWxsIHRoZSBzX25lZWRfc3luY19mcwogKiBmbGFncyBhZ2Fpbiwgd2hpY2ggd2lsbCBjYXVzZSBwcm9jZXNzIEEgdG8gcmVzeW5jIGV2ZXJ5dGhpbmcuICBGaXggdGhhdCB3aXRoCiAqIGEgbG9jYWwgbXV0ZXguCiAqCiAqIChGYWJpYW4pIEF2b2lkIHN5bmNfZnMgd2l0aCBjbGVhbiBmcyAmIHdhaXQgbW9kZSAwCiAqLwp2b2lkIHN5bmNfZmlsZXN5c3RlbXMoaW50IHdhaXQpCnsKCXN0cnVjdCBzdXBlcl9ibG9jayAqc2I7CglzdGF0aWMgREVGSU5FX01VVEVYKG11dGV4KTsKCgltdXRleF9sb2NrKCZtdXRleCk7CQkvKiBDb3VsZCBiZSBkb3duX2ludGVycnVwdGlibGUgKi8KCXNwaW5fbG9jaygmc2JfbG9jayk7CglsaXN0X2Zvcl9lYWNoX2VudHJ5KHNiLCAmc3VwZXJfYmxvY2tzLCBzX2xpc3QpIHsKCQlpZiAoIXNiLT5zX29wLT5zeW5jX2ZzKQoJCQljb250aW51ZTsKCQlpZiAoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpCgkJCWNvbnRpbnVlOwoJCXNiLT5zX25lZWRfc3luY19mcyA9IDE7Cgl9CgpyZXN0YXJ0OgoJbGlzdF9mb3JfZWFjaF9lbnRyeShzYiwgJnN1cGVyX2Jsb2Nrcywgc19saXN0KSB7CgkJaWYgKCFzYi0+c19uZWVkX3N5bmNfZnMpCgkJCWNvbnRpbnVlOwoJCXNiLT5zX25lZWRfc3luY19mcyA9IDA7CgkJaWYgKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKQoJCQljb250aW51ZTsJLyogaG0uICBXYXMgcmVtb3VudGVkIHIvbyBtZWFud2hpbGUgKi8KCQlzYi0+c19jb3VudCsrOwoJCXNwaW5fdW5sb2NrKCZzYl9sb2NrKTsKCQlkb3duX3JlYWQoJnNiLT5zX3Vtb3VudCk7CgkJaWYgKHNiLT5zX3Jvb3QgJiYgKHdhaXQgfHwgc2ItPnNfZGlydCkpCgkJCXNiLT5zX29wLT5zeW5jX2ZzKHNiLCB3YWl0KTsKCQl1cF9yZWFkKCZzYi0+c191bW91bnQpOwoJCS8qIHJlc3RhcnQgb25seSB3aGVuIHNiIGlzIG5vIGxvbmdlciBvbiB0aGUgbGlzdCAqLwoJCXNwaW5fbG9jaygmc2JfbG9jayk7CgkJaWYgKF9fcHV0X3N1cGVyX2FuZF9uZWVkX3Jlc3RhcnQoc2IpKQoJCQlnb3RvIHJlc3RhcnQ7Cgl9CglzcGluX3VubG9jaygmc2JfbG9jayk7CgltdXRleF91bmxvY2soJm11dGV4KTsKfQoKLyoqCiAqCWdldF9zdXBlciAtIGdldCB0aGUgc3VwZXJibG9jayBvZiBhIGRldmljZQogKglAYmRldjogZGV2aWNlIHRvIGdldCB0aGUgc3VwZXJibG9jayBmb3IKICoJCiAqCVNjYW5zIHRoZSBzdXBlcmJsb2NrIGxpc3QgYW5kIGZpbmRzIHRoZSBzdXBlcmJsb2NrIG9mIHRoZSBmaWxlIHN5c3RlbQogKgltb3VudGVkIG9uIHRoZSBkZXZpY2UgZ2l2ZW4uICVOVUxMIGlzIHJldHVybmVkIGlmIG5vIG1hdGNoIGlzIGZvdW5kLgogKi8KCnN0cnVjdCBzdXBlcl9ibG9jayAqIGdldF9zdXBlcihzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2KQp7CglzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiOwoKCWlmICghYmRldikKCQlyZXR1cm4gTlVMTDsKCglzcGluX2xvY2soJnNiX2xvY2spOwpyZXNjYW46CglsaXN0X2Zvcl9lYWNoX2VudHJ5KHNiLCAmc3VwZXJfYmxvY2tzLCBzX2xpc3QpIHsKCQlpZiAoc2ItPnNfYmRldiA9PSBiZGV2KSB7CgkJCXNiLT5zX2NvdW50Kys7CgkJCXNwaW5fdW5sb2NrKCZzYl9sb2NrKTsKCQkJZG93bl9yZWFkKCZzYi0+c191bW91bnQpOwoJCQlpZiAoc2ItPnNfcm9vdCkKCQkJCXJldHVybiBzYjsKCQkJdXBfcmVhZCgmc2ItPnNfdW1vdW50KTsKCQkJLyogcmVzdGFydCBvbmx5IHdoZW4gc2IgaXMgbm8gbG9uZ2VyIG9uIHRoZSBsaXN0ICovCgkJCXNwaW5fbG9jaygmc2JfbG9jayk7CgkJCWlmIChfX3B1dF9zdXBlcl9hbmRfbmVlZF9yZXN0YXJ0KHNiKSkKCQkJCWdvdG8gcmVzY2FuOwoJCX0KCX0KCXNwaW5fdW5sb2NrKCZzYl9sb2NrKTsKCXJldHVybiBOVUxMOwp9CgpFWFBPUlRfU1lNQk9MKGdldF9zdXBlcik7CiAKc3RydWN0IHN1cGVyX2Jsb2NrICogdXNlcl9nZXRfc3VwZXIoZGV2X3QgZGV2KQp7CglzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiOwoKCXNwaW5fbG9jaygmc2JfbG9jayk7CnJlc2NhbjoKCWxpc3RfZm9yX2VhY2hfZW50cnkoc2IsICZzdXBlcl9ibG9ja3MsIHNfbGlzdCkgewoJCWlmIChzYi0+c19kZXYgPT0gIGRldikgewoJCQlzYi0+c19jb3VudCsrOwoJCQlzcGluX3VubG9jaygmc2JfbG9jayk7CgkJCWRvd25fcmVhZCgmc2ItPnNfdW1vdW50KTsKCQkJaWYgKHNiLT5zX3Jvb3QpCgkJCQlyZXR1cm4gc2I7CgkJCXVwX3JlYWQoJnNiLT5zX3Vtb3VudCk7CgkJCS8qIHJlc3RhcnQgb25seSB3aGVuIHNiIGlzIG5vIGxvbmdlciBvbiB0aGUgbGlzdCAqLwoJCQlzcGluX2xvY2soJnNiX2xvY2spOwoJCQlpZiAoX19wdXRfc3VwZXJfYW5kX25lZWRfcmVzdGFydChzYikpCgkJCQlnb3RvIHJlc2NhbjsKCQl9Cgl9CglzcGluX3VubG9jaygmc2JfbG9jayk7CglyZXR1cm4gTlVMTDsKfQoKYXNtbGlua2FnZSBsb25nIHN5c191c3RhdCh1bnNpZ25lZCBkZXYsIHN0cnVjdCB1c3RhdCBfX3VzZXIgKiB1YnVmKQp7CiAgICAgICAgc3RydWN0IHN1cGVyX2Jsb2NrICpzOwogICAgICAgIHN0cnVjdCB1c3RhdCB0bXA7CiAgICAgICAgc3RydWN0IGtzdGF0ZnMgc2J1ZjsKCWludCBlcnIgPSAtRUlOVkFMOwoKICAgICAgICBzID0gdXNlcl9nZXRfc3VwZXIobmV3X2RlY29kZV9kZXYoZGV2KSk7CiAgICAgICAgaWYgKHMgPT0gTlVMTCkKICAgICAgICAgICAgICAgIGdvdG8gb3V0OwoJZXJyID0gdmZzX3N0YXRmcyhzLT5zX3Jvb3QsICZzYnVmKTsKCWRyb3Bfc3VwZXIocyk7CglpZiAoZXJyKQoJCWdvdG8gb3V0OwoKICAgICAgICBtZW1zZXQoJnRtcCwwLHNpemVvZihzdHJ1Y3QgdXN0YXQpKTsKICAgICAgICB0bXAuZl90ZnJlZSA9IHNidWYuZl9iZnJlZTsKICAgICAgICB0bXAuZl90aW5vZGUgPSBzYnVmLmZfZmZyZWU7CgogICAgICAgIGVyciA9IGNvcHlfdG9fdXNlcih1YnVmLCZ0bXAsc2l6ZW9mKHN0cnVjdCB1c3RhdCkpID8gLUVGQVVMVCA6IDA7Cm91dDoKCXJldHVybiBlcnI7Cn0KCi8qKgogKgltYXJrX2ZpbGVzX3JvCiAqCUBzYjogc3VwZXJibG9jayBpbiBxdWVzdGlvbgogKgogKglBbGwgZmlsZXMgYXJlIG1hcmtlZCByZWFkL29ubHkuICBXZSBkb24ndCBjYXJlIGFib3V0IHBlbmRpbmcKICoJZGVsZXRlIGZpbGVzIHNvIHRoaXMgc2hvdWxkIGJlIHVzZWQgaW4gJ2ZvcmNlJyBtb2RlIG9ubHkKICovCgpzdGF0aWMgdm9pZCBtYXJrX2ZpbGVzX3JvKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCnsKCXN0cnVjdCBmaWxlICpmOwoKCWZpbGVfbGlzdF9sb2NrKCk7CglsaXN0X2Zvcl9lYWNoX2VudHJ5KGYsICZzYi0+c19maWxlcywgZl91LmZ1X2xpc3QpIHsKCQlpZiAoU19JU1JFRyhmLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9tb2RlKSAmJiBmaWxlX2NvdW50KGYpKQoJCQlmLT5mX21vZGUgJj0gfkZNT0RFX1dSSVRFOwoJfQoJZmlsZV9saXN0X3VubG9jaygpOwp9CgovKioKICoJZG9fcmVtb3VudF9zYiAtIGFza3MgZmlsZXN5c3RlbSB0byBjaGFuZ2UgbW91bnQgb3B0aW9ucy4KICoJQHNiOglzdXBlcmJsb2NrIGluIHF1ZXN0aW9uCiAqCUBmbGFnczoJbnVtZXJpYyBwYXJ0IG9mIG9wdGlvbnMKICoJQGRhdGE6CXRoZSByZXN0IG9mIG9wdGlvbnMKICogICAgICBAZm9yY2U6IHdoZXRoZXIgb3Igbm90IHRvIGZvcmNlIHRoZSBjaGFuZ2UKICoKICoJQWx0ZXJzIHRoZSBtb3VudCBvcHRpb25zIG9mIGEgbW91bnRlZCBmaWxlIHN5c3RlbS4KICovCmludCBkb19yZW1vdW50X3NiKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCBmbGFncywgdm9pZCAqZGF0YSwgaW50IGZvcmNlKQp7CglpbnQgcmV0dmFsOwoJCiNpZmRlZiBDT05GSUdfQkxPQ0sKCWlmICghKGZsYWdzICYgTVNfUkRPTkxZKSAmJiBiZGV2X3JlYWRfb25seShzYi0+c19iZGV2KSkKCQlyZXR1cm4gLUVBQ0NFUzsKI2VuZGlmCglpZiAoZmxhZ3MgJiBNU19SRE9OTFkpCgkJYWNjdF9hdXRvX2Nsb3NlKHNiKTsKCXNocmlua19kY2FjaGVfc2Ioc2IpOwoJZnN5bmNfc3VwZXIoc2IpOwoKCS8qIElmIHdlIGFyZSByZW1vdW50aW5nIFJET05MWSBhbmQgY3VycmVudCBzYiBpcyByZWFkL3dyaXRlLAoJICAgbWFrZSBzdXJlIHRoZXJlIGFyZSBubyBydyBmaWxlcyBvcGVuZWQgKi8KCWlmICgoZmxhZ3MgJiBNU19SRE9OTFkpICYmICEoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpKSB7CgkJaWYgKGZvcmNlKQoJCQltYXJrX2ZpbGVzX3JvKHNiKTsKCQllbHNlIGlmICghZnNfbWF5X3JlbW91bnRfcm8oc2IpKQoJCQlyZXR1cm4gLUVCVVNZOwoJfQoKCWlmIChzYi0+c19vcC0+cmVtb3VudF9mcykgewoJCWxvY2tfc3VwZXIoc2IpOwoJCXJldHZhbCA9IHNiLT5zX29wLT5yZW1vdW50X2ZzKHNiLCAmZmxhZ3MsIGRhdGEpOwoJCXVubG9ja19zdXBlcihzYik7CgkJaWYgKHJldHZhbCkKCQkJcmV0dXJuIHJldHZhbDsKCX0KCXNiLT5zX2ZsYWdzID0gKHNiLT5zX2ZsYWdzICYgfk1TX1JNVF9NQVNLKSB8IChmbGFncyAmIE1TX1JNVF9NQVNLKTsKCXJldHVybiAwOwp9CgpzdGF0aWMgdm9pZCBkb19lbWVyZ2VuY3lfcmVtb3VudCh1bnNpZ25lZCBsb25nIGZvbykKewoJc3RydWN0IHN1cGVyX2Jsb2NrICpzYjsKCglzcGluX2xvY2soJnNiX2xvY2spOwoJbGlzdF9mb3JfZWFjaF9lbnRyeShzYiwgJnN1cGVyX2Jsb2Nrcywgc19saXN0KSB7CgkJc2ItPnNfY291bnQrKzsKCQlzcGluX3VubG9jaygmc2JfbG9jayk7CgkJZG93bl9yZWFkKCZzYi0+c191bW91bnQpOwoJCWlmIChzYi0+c19yb290ICYmIHNiLT5zX2JkZXYgJiYgIShzYi0+c19mbGFncyAmIE1TX1JET05MWSkpIHsKCQkJLyoKCQkJICogLT5yZW1vdW50X2ZzIG5lZWRzIGxvY2tfa2VybmVsKCkuCgkJCSAqCgkJCSAqIFdoYXQgbG9jayBwcm90ZWN0cyBzYi0+c19mbGFncz8/CgkJCSAqLwoJCQlsb2NrX2tlcm5lbCgpOwoJCQlkb19yZW1vdW50X3NiKHNiLCBNU19SRE9OTFksIE5VTEwsIDEpOwoJCQl1bmxvY2tfa2VybmVsKCk7CgkJfQoJCWRyb3Bfc3VwZXIoc2IpOwoJCXNwaW5fbG9jaygmc2JfbG9jayk7Cgl9CglzcGluX3VubG9jaygmc2JfbG9jayk7CglwcmludGsoIkVtZXJnZW5jeSBSZW1vdW50IGNvbXBsZXRlXG4iKTsKfQoKdm9pZCBlbWVyZ2VuY3lfcmVtb3VudCh2b2lkKQp7CglwZGZsdXNoX29wZXJhdGlvbihkb19lbWVyZ2VuY3lfcmVtb3VudCwgMCk7Cn0KCi8qCiAqIFVubmFtZWQgYmxvY2sgZGV2aWNlcyBhcmUgZHVtbXkgZGV2aWNlcyB1c2VkIGJ5IHZpcnR1YWwKICogZmlsZXN5c3RlbXMgd2hpY2ggZG9uJ3QgdXNlIHJlYWwgYmxvY2stZGV2aWNlcy4gIC0tIGpycwogKi8KCnN0YXRpYyBzdHJ1Y3QgaWRyIHVubmFtZWRfZGV2X2lkcjsKc3RhdGljIERFRklORV9TUElOTE9DSyh1bm5hbWVkX2Rldl9sb2NrKTsvKiBwcm90ZWN0cyB0aGUgYWJvdmUgKi8KCmludCBzZXRfYW5vbl9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIHZvaWQgKmRhdGEpCnsKCWludCBkZXY7CglpbnQgZXJyb3I7CgogcmV0cnk6CglpZiAoaWRyX3ByZV9nZXQoJnVubmFtZWRfZGV2X2lkciwgR0ZQX0FUT01JQykgPT0gMCkKCQlyZXR1cm4gLUVOT01FTTsKCXNwaW5fbG9jaygmdW5uYW1lZF9kZXZfbG9jayk7CgllcnJvciA9IGlkcl9nZXRfbmV3KCZ1bm5hbWVkX2Rldl9pZHIsIE5VTEwsICZkZXYpOwoJc3Bpbl91bmxvY2soJnVubmFtZWRfZGV2X2xvY2spOwoJaWYgKGVycm9yID09IC1FQUdBSU4pCgkJLyogV2UgcmFjZWQgYW5kIGxvc3Qgd2l0aCBhbm90aGVyIENQVS4gKi8KCQlnb3RvIHJldHJ5OwoJZWxzZSBpZiAoZXJyb3IpCgkJcmV0dXJuIC1FQUdBSU47CgoJaWYgKChkZXYgJiBNQVhfSURfTUFTSykgPT0gKDEgPDwgTUlOT1JCSVRTKSkgewoJCXNwaW5fbG9jaygmdW5uYW1lZF9kZXZfbG9jayk7CgkJaWRyX3JlbW92ZSgmdW5uYW1lZF9kZXZfaWRyLCBkZXYpOwoJCXNwaW5fdW5sb2NrKCZ1bm5hbWVkX2Rldl9sb2NrKTsKCQlyZXR1cm4gLUVNRklMRTsKCX0KCXMtPnNfZGV2ID0gTUtERVYoMCwgZGV2ICYgTUlOT1JNQVNLKTsKCXJldHVybiAwOwp9CgpFWFBPUlRfU1lNQk9MKHNldF9hbm9uX3N1cGVyKTsKCnZvaWQga2lsbF9hbm9uX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCnsKCWludCBzbG90ID0gTUlOT1Ioc2ItPnNfZGV2KTsKCglnZW5lcmljX3NodXRkb3duX3N1cGVyKHNiKTsKCXNwaW5fbG9jaygmdW5uYW1lZF9kZXZfbG9jayk7CglpZHJfcmVtb3ZlKCZ1bm5hbWVkX2Rldl9pZHIsIHNsb3QpOwoJc3Bpbl91bmxvY2soJnVubmFtZWRfZGV2X2xvY2spOwp9CgpFWFBPUlRfU1lNQk9MKGtpbGxfYW5vbl9zdXBlcik7Cgp2b2lkIF9faW5pdCB1bm5hbWVkX2Rldl9pbml0KHZvaWQpCnsKCWlkcl9pbml0KCZ1bm5hbWVkX2Rldl9pZHIpOwp9Cgp2b2lkIGtpbGxfbGl0dGVyX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCnsKCWlmIChzYi0+c19yb290KQoJCWRfZ2Vub2NpZGUoc2ItPnNfcm9vdCk7CglraWxsX2Fub25fc3VwZXIoc2IpOwp9CgpFWFBPUlRfU1lNQk9MKGtpbGxfbGl0dGVyX3N1cGVyKTsKCiNpZmRlZiBDT05GSUdfQkxPQ0sKc3RhdGljIGludCBzZXRfYmRldl9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIHZvaWQgKmRhdGEpCnsKCXMtPnNfYmRldiA9IGRhdGE7CglzLT5zX2RldiA9IHMtPnNfYmRldi0+YmRfZGV2OwoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgdGVzdF9iZGV2X3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgdm9pZCAqZGF0YSkKewoJcmV0dXJuICh2b2lkICopcy0+c19iZGV2ID09IGRhdGE7Cn0KCnN0YXRpYyB2b2lkIGJkZXZfdWV2ZW50KHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIGVudW0ga29iamVjdF9hY3Rpb24gYWN0aW9uKQp7CglpZiAoYmRldi0+YmRfZGlzaykgewoJCWlmIChiZGV2LT5iZF9wYXJ0KQoJCQlrb2JqZWN0X3VldmVudCgmYmRldi0+YmRfcGFydC0+a29iaiwgYWN0aW9uKTsKCQllbHNlCgkJCWtvYmplY3RfdWV2ZW50KCZiZGV2LT5iZF9kaXNrLT5rb2JqLCBhY3Rpb24pOwoJfQp9CgppbnQgZ2V0X3NiX2JkZXYoc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCglpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldl9uYW1lLCB2b2lkICpkYXRhLAoJaW50ICgqZmlsbF9zdXBlcikoc3RydWN0IHN1cGVyX2Jsb2NrICosIHZvaWQgKiwgaW50KSwKCXN0cnVjdCB2ZnNtb3VudCAqbW50KQp7CglzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2OwoJc3RydWN0IHN1cGVyX2Jsb2NrICpzOwoJaW50IGVycm9yID0gMDsKCgliZGV2ID0gb3Blbl9iZGV2X2V4Y2woZGV2X25hbWUsIGZsYWdzLCBmc190eXBlKTsKCWlmIChJU19FUlIoYmRldikpCgkJcmV0dXJuIFBUUl9FUlIoYmRldik7CgoJLyoKCSAqIG9uY2UgdGhlIHN1cGVyIGlzIGluc2VydGVkIGludG8gdGhlIGxpc3QgYnkgc2dldCwgc191bW91bnQKCSAqIHdpbGwgcHJvdGVjdCB0aGUgbG9ja2ZzIGNvZGUgZnJvbSB0cnlpbmcgdG8gc3RhcnQgYSBzbmFwc2hvdAoJICogd2hpbGUgd2UgYXJlIG1vdW50aW5nCgkgKi8KCW11dGV4X2xvY2soJmJkZXYtPmJkX21vdW50X211dGV4KTsKCXMgPSBzZ2V0KGZzX3R5cGUsIHRlc3RfYmRldl9zdXBlciwgc2V0X2JkZXZfc3VwZXIsIGJkZXYpOwoJbXV0ZXhfdW5sb2NrKCZiZGV2LT5iZF9tb3VudF9tdXRleCk7CglpZiAoSVNfRVJSKHMpKQoJCWdvdG8gZXJyb3JfczsKCglpZiAocy0+c19yb290KSB7CgkJaWYgKChmbGFncyBeIHMtPnNfZmxhZ3MpICYgTVNfUkRPTkxZKSB7CgkJCXVwX3dyaXRlKCZzLT5zX3Vtb3VudCk7CgkJCWRlYWN0aXZhdGVfc3VwZXIocyk7CgkJCWVycm9yID0gLUVCVVNZOwoJCQlnb3RvIGVycm9yX2JkZXY7CgkJfQoKCQljbG9zZV9iZGV2X2V4Y2woYmRldik7Cgl9IGVsc2UgewoJCWNoYXIgYltCREVWTkFNRV9TSVpFXTsKCgkJcy0+c19mbGFncyA9IGZsYWdzOwoJCXN0cmxjcHkocy0+c19pZCwgYmRldm5hbWUoYmRldiwgYiksIHNpemVvZihzLT5zX2lkKSk7CgkJc2Jfc2V0X2Jsb2Nrc2l6ZShzLCBibG9ja19zaXplKGJkZXYpKTsKCQllcnJvciA9IGZpbGxfc3VwZXIocywgZGF0YSwgZmxhZ3MgJiBNU19TSUxFTlQgPyAxIDogMCk7CgkJaWYgKGVycm9yKSB7CgkJCXVwX3dyaXRlKCZzLT5zX3Vtb3VudCk7CgkJCWRlYWN0aXZhdGVfc3VwZXIocyk7CgkJCWdvdG8gZXJyb3I7CgkJfQoKCQlzLT5zX2ZsYWdzIHw9IE1TX0FDVElWRTsKCQliZGV2X3VldmVudChiZGV2LCBLT0JKX01PVU5UKTsKCX0KCglyZXR1cm4gc2ltcGxlX3NldF9tbnQobW50LCBzKTsKCmVycm9yX3M6CgllcnJvciA9IFBUUl9FUlIocyk7CmVycm9yX2JkZXY6CgljbG9zZV9iZGV2X2V4Y2woYmRldik7CmVycm9yOgoJcmV0dXJuIGVycm9yOwp9CgpFWFBPUlRfU1lNQk9MKGdldF9zYl9iZGV2KTsKCnZvaWQga2lsbF9ibG9ja19zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQp7CglzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2ID0gc2ItPnNfYmRldjsKCgliZGV2X3VldmVudChiZGV2LCBLT0JKX1VNT1VOVCk7CglnZW5lcmljX3NodXRkb3duX3N1cGVyKHNiKTsKCXN5bmNfYmxvY2tkZXYoYmRldik7CgljbG9zZV9iZGV2X2V4Y2woYmRldik7Cn0KCkVYUE9SVF9TWU1CT0woa2lsbF9ibG9ja19zdXBlcik7CiNlbmRpZgoKaW50IGdldF9zYl9ub2RldihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKCWludCBmbGFncywgdm9pZCAqZGF0YSwKCWludCAoKmZpbGxfc3VwZXIpKHN0cnVjdCBzdXBlcl9ibG9jayAqLCB2b2lkICosIGludCksCglzdHJ1Y3QgdmZzbW91bnQgKm1udCkKewoJaW50IGVycm9yOwoJc3RydWN0IHN1cGVyX2Jsb2NrICpzID0gc2dldChmc190eXBlLCBOVUxMLCBzZXRfYW5vbl9zdXBlciwgTlVMTCk7CgoJaWYgKElTX0VSUihzKSkKCQlyZXR1cm4gUFRSX0VSUihzKTsKCglzLT5zX2ZsYWdzID0gZmxhZ3M7CgoJZXJyb3IgPSBmaWxsX3N1cGVyKHMsIGRhdGEsIGZsYWdzICYgTVNfU0lMRU5UID8gMSA6IDApOwoJaWYgKGVycm9yKSB7CgkJdXBfd3JpdGUoJnMtPnNfdW1vdW50KTsKCQlkZWFjdGl2YXRlX3N1cGVyKHMpOwoJCXJldHVybiBlcnJvcjsKCX0KCXMtPnNfZmxhZ3MgfD0gTVNfQUNUSVZFOwoJcmV0dXJuIHNpbXBsZV9zZXRfbW50KG1udCwgcyk7Cn0KCkVYUE9SVF9TWU1CT0woZ2V0X3NiX25vZGV2KTsKCnN0YXRpYyBpbnQgY29tcGFyZV9zaW5nbGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCB2b2lkICpwKQp7CglyZXR1cm4gMTsKfQoKaW50IGdldF9zYl9zaW5nbGUoc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCglpbnQgZmxhZ3MsIHZvaWQgKmRhdGEsCglpbnQgKCpmaWxsX3N1cGVyKShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgdm9pZCAqLCBpbnQpLAoJc3RydWN0IHZmc21vdW50ICptbnQpCnsKCXN0cnVjdCBzdXBlcl9ibG9jayAqczsKCWludCBlcnJvcjsKCglzID0gc2dldChmc190eXBlLCBjb21wYXJlX3NpbmdsZSwgc2V0X2Fub25fc3VwZXIsIE5VTEwpOwoJaWYgKElTX0VSUihzKSkKCQlyZXR1cm4gUFRSX0VSUihzKTsKCWlmICghcy0+c19yb290KSB7CgkJcy0+c19mbGFncyA9IGZsYWdzOwoJCWVycm9yID0gZmlsbF9zdXBlcihzLCBkYXRhLCBmbGFncyAmIE1TX1NJTEVOVCA/IDEgOiAwKTsKCQlpZiAoZXJyb3IpIHsKCQkJdXBfd3JpdGUoJnMtPnNfdW1vdW50KTsKCQkJZGVhY3RpdmF0ZV9zdXBlcihzKTsKCQkJcmV0dXJuIGVycm9yOwoJCX0KCQlzLT5zX2ZsYWdzIHw9IE1TX0FDVElWRTsKCX0KCWRvX3JlbW91bnRfc2IocywgZmxhZ3MsIGRhdGEsIDApOwoJcmV0dXJuIHNpbXBsZV9zZXRfbW50KG1udCwgcyk7Cn0KCkVYUE9SVF9TWU1CT0woZ2V0X3NiX3NpbmdsZSk7CgpzdHJ1Y3QgdmZzbW91bnQgKgp2ZnNfa2Vybl9tb3VudChzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqdHlwZSwgaW50IGZsYWdzLCBjb25zdCBjaGFyICpuYW1lLCB2b2lkICpkYXRhKQp7CglzdHJ1Y3QgdmZzbW91bnQgKm1udDsKCWNoYXIgKnNlY2RhdGEgPSBOVUxMOwoJaW50IGVycm9yOwoKCWlmICghdHlwZSkKCQlyZXR1cm4gRVJSX1BUUigtRU5PREVWKTsKCgllcnJvciA9IC1FTk9NRU07CgltbnQgPSBhbGxvY192ZnNtbnQobmFtZSk7CglpZiAoIW1udCkKCQlnb3RvIG91dDsKCglpZiAoZGF0YSkgewoJCXNlY2RhdGEgPSBhbGxvY19zZWNkYXRhKCk7CgkJaWYgKCFzZWNkYXRhKQoJCQlnb3RvIG91dF9tbnQ7CgoJCWVycm9yID0gc2VjdXJpdHlfc2JfY29weV9kYXRhKHR5cGUsIGRhdGEsIHNlY2RhdGEpOwoJCWlmIChlcnJvcikKCQkJZ290byBvdXRfZnJlZV9zZWNkYXRhOwoJfQoKCWVycm9yID0gdHlwZS0+Z2V0X3NiKHR5cGUsIGZsYWdzLCBuYW1lLCBkYXRhLCBtbnQpOwoJaWYgKGVycm9yIDwgMCkKCQlnb3RvIG91dF9mcmVlX3NlY2RhdGE7CgogCWVycm9yID0gc2VjdXJpdHlfc2Jfa2Vybl9tb3VudChtbnQtPm1udF9zYiwgc2VjZGF0YSk7CiAJaWYgKGVycm9yKQogCQlnb3RvIG91dF9zYjsKCgltbnQtPm1udF9tb3VudHBvaW50ID0gbW50LT5tbnRfcm9vdDsKCW1udC0+bW50X3BhcmVudCA9IG1udDsKCXVwX3dyaXRlKCZtbnQtPm1udF9zYi0+c191bW91bnQpOwoJZnJlZV9zZWNkYXRhKHNlY2RhdGEpOwoJcmV0dXJuIG1udDsKb3V0X3NiOgoJZHB1dChtbnQtPm1udF9yb290KTsKCXVwX3dyaXRlKCZtbnQtPm1udF9zYi0+c191bW91bnQpOwoJZGVhY3RpdmF0ZV9zdXBlcihtbnQtPm1udF9zYik7Cm91dF9mcmVlX3NlY2RhdGE6CglmcmVlX3NlY2RhdGEoc2VjZGF0YSk7Cm91dF9tbnQ6CglmcmVlX3Zmc21udChtbnQpOwpvdXQ6CglyZXR1cm4gRVJSX1BUUihlcnJvcik7Cn0KCkVYUE9SVF9TWU1CT0xfR1BMKHZmc19rZXJuX21vdW50KTsKCnN0cnVjdCB2ZnNtb3VudCAqCmRvX2tlcm5fbW91bnQoY29uc3QgY2hhciAqZnN0eXBlLCBpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKmRhdGEpCnsKCXN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICp0eXBlID0gZ2V0X2ZzX3R5cGUoZnN0eXBlKTsKCXN0cnVjdCB2ZnNtb3VudCAqbW50OwoJaWYgKCF0eXBlKQoJCXJldHVybiBFUlJfUFRSKC1FTk9ERVYpOwoJbW50ID0gdmZzX2tlcm5fbW91bnQodHlwZSwgZmxhZ3MsIG5hbWUsIGRhdGEpOwoJcHV0X2ZpbGVzeXN0ZW0odHlwZSk7CglyZXR1cm4gbW50Owp9CgpzdHJ1Y3QgdmZzbW91bnQgKmtlcm5fbW91bnQoc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKnR5cGUpCnsKCXJldHVybiB2ZnNfa2Vybl9tb3VudCh0eXBlLCAwLCB0eXBlLT5uYW1lLCBOVUxMKTsKfQoKRVhQT1JUX1NZTUJPTChrZXJuX21vdW50KTsK