LyoKICogIGxpbnV4L2RyaXZlcnMvaWRlL2xlZ2FjeS9xNDBpZGUuYyAtLSBRNDAgSS9PIHBvcnQgSURFIERyaXZlcgogKgogKiAgICAgKGMpIFJpY2hhcmQgWmlkbGlja3kKICoKICogIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCiAqICBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZSBmb3IKICogIG1vcmUgZGV0YWlscy4KICoKICoKICovCgojaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KI2luY2x1ZGUgPGxpbnV4L21tLmg+CiNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgojaW5jbHVkZSA8bGludXgvaGRyZWcuaD4KCiNpbmNsdWRlIDxsaW51eC9pZGUuaD4KCiAgICAvKgogICAgICogIEJhc2VzIG9mIHRoZSBJREUgaW50ZXJmYWNlcwogICAgICovCgojZGVmaW5lIFE0MElERV9OVU1fSFdJRlMJMgoKI2RlZmluZSBQQ0lERV9CQVNFMQkweDFmMAojZGVmaW5lIFBDSURFX0JBU0UyCTB4MTcwCiNkZWZpbmUgUENJREVfQkFTRTMJMHgxZTgKI2RlZmluZSBQQ0lERV9CQVNFNAkweDE2OAojZGVmaW5lIFBDSURFX0JBU0U1CTB4MWUwCiNkZWZpbmUgUENJREVfQkFTRTYJMHgxNjAKCnN0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIHBjaWRlX2Jhc2VzW1E0MElERV9OVU1fSFdJRlNdID0gewogICAgUENJREVfQkFTRTEsIFBDSURFX0JBU0UyLCAvKiBQQ0lERV9CQVNFMywgUENJREVfQkFTRTQgICwgUENJREVfQkFTRTUsCiAgICBQQ0lERV9CQVNFNiAqLwp9OwoKCiAgICAvKgogICAgICogIE9mZnNldHMgZnJvbSBvbmUgb2YgdGhlIGFib3ZlIGJhc2VzCiAgICAgKi8KCi8qIHVzZWQgdG8gZG8gYWRkciB0cmFuc2xhdGlvbiBoZXJlIGJ1dCBpdCBpcyBlYXNpZXIgdG8gZG8gaW4gc2V0dXAgcG9ydHMgKi8KLyojZGVmaW5lIElERV9PRkZfQih4KQkoKHVuc2lnbmVkIGxvbmcpUTQwX0lTQV9JT19CKChJREVfIyN4IyNfT0ZGU0VUKSkpKi8KCiNkZWZpbmUgSURFX09GRl9CKHgpCSgodW5zaWduZWQgbG9uZykoKElERV8jI3gjI19PRkZTRVQpKSkKI2RlZmluZSBJREVfT0ZGX1coeCkJKCh1bnNpZ25lZCBsb25nKSgoSURFXyMjeCMjX09GRlNFVCkpKQoKc3RhdGljIGNvbnN0IGludCBwY2lkZV9vZmZzZXRzW0lERV9OUl9QT1JUU10gPSB7CiAgICBJREVfT0ZGX1coREFUQSksIElERV9PRkZfQihFUlJPUiksIElERV9PRkZfQihOU0VDVE9SKSwgSURFX09GRl9CKFNFQ1RPUiksCiAgICBJREVfT0ZGX0IoTENZTCksIElERV9PRkZfQihIQ1lMKSwgNiAvKklERV9PRkZfQihDVVJSRU5UKSovLCBJREVfT0ZGX0IoU1RBVFVTKSwKICAgIDUxOC8qSURFX09GRihDTUQpKi8KfTsKCnN0YXRpYyBpbnQgcTQwaWRlX2RlZmF1bHRfaXJxKHVuc2lnbmVkIGxvbmcgYmFzZSkKewogICAgICAgICAgIHN3aXRjaCAoYmFzZSkgewoJICAgICAgICAgICAgY2FzZSAweDFmMDogcmV0dXJuIDE0OwoJCSAgICBjYXNlIDB4MTcwOiByZXR1cm4gMTU7CgkJICAgIGNhc2UgMHgxZTg6IHJldHVybiAxMTsKCQkgICAgZGVmYXVsdDoKCQkJcmV0dXJuIDA7CgkgICB9Cn0KCgovKgogKiBUaGlzIGlzIHZlcnkgc2ltaWxhciB0byBpZGVfc2V0dXBfcG9ydHMgZXhjZXB0IHRoYXQgYWRkcmVzc2VzCiAqIGFyZSBwcmV0cmFuc2xhdGVkIGZvciBxNDAgSVNBIGFjY2VzcwogKi8Kdm9pZCBxNDBfaWRlX3NldHVwX3BvcnRzICggaHdfcmVnc190ICpodywKCQkJdW5zaWduZWQgbG9uZyBiYXNlLCBpbnQgKm9mZnNldHMsCgkJCXVuc2lnbmVkIGxvbmcgY3RybCwgdW5zaWduZWQgbG9uZyBpbnRyLAoJCQlpZGVfYWNrX2ludHJfdCAqYWNrX2ludHIsCi8qCiAqCQkJaWRlX2lvX29wc190ICppb3BzLAogKi8KCQkJaW50IGlycSkKewoJaW50IGk7CgoJZm9yIChpID0gMDsgaSA8IElERV9OUl9QT1JUUzsgaSsrKSB7CgkJLyogQklHIEZBVCBXQVJOSU5HOiAKCQkgICBhc3N1bXB0aW9uOiBvbmx5IERBVEEgcG9ydCBpcyBldmVyIHVzZWQgaW4gMTYgYml0IG1vZGUgKi8KCQlpZiAoIGk9PTAgKQoJCQlody0+aW9fcG9ydHNbaV0gPSBRNDBfSVNBX0lPX1coYmFzZSArIG9mZnNldHNbaV0pOwoJCWVsc2UKCQkJaHctPmlvX3BvcnRzW2ldID0gUTQwX0lTQV9JT19CKGJhc2UgKyBvZmZzZXRzW2ldKTsKCX0KCQoJaHctPmlycSA9IGlycTsKCWh3LT5kbWEgPSBOT19ETUE7Cglody0+YWNrX2ludHIgPSBhY2tfaW50cjsKLyoKICoJaHctPmlvcHMgPSBpb3BzOwogKi8KfQoKCgovKiAKICogdGhlIHN0YXRpYyBhcnJheSBpcyBuZWVkZWQgdG8gaGF2ZSB0aGUgbmFtZSByZXBvcnRlZCBpbiAvcHJvYy9pb3BvcnRzLAogKiBod2lmLT5uYW1lIHVuZm9ydHVuYXRlbHkgaXNutHQgYXZhaWxhYmxlIHlldAogKi8Kc3RhdGljIGNvbnN0IGNoYXIgKnE0MF9pZGVfbmFtZXNbUTQwSURFX05VTV9IV0lGU109ewoJImlkZTAiLCAiaWRlMSIKfTsKCi8qCiAqICBQcm9iZSBmb3IgUTQwIElERSBpbnRlcmZhY2VzCiAqLwoKdm9pZCBxNDBpZGVfaW5pdCh2b2lkKQp7CiAgICBpbnQgaTsKICAgIGlkZV9od2lmX3QgKmh3aWY7CiAgICBpbnQgaW5kZXg7CiAgICBjb25zdCBjaGFyICpuYW1lOwoKICAgIGlmICghTUFDSF9JU19RNDApCiAgICAgIHJldHVybiA7CgogICAgZm9yIChpID0gMDsgaSA8IFE0MElERV9OVU1fSFdJRlM7IGkrKykgewoJaHdfcmVnc190IGh3OwoKCW5hbWUgPSBxNDBfaWRlX25hbWVzW2ldOwoJaWYgKCFyZXF1ZXN0X3JlZ2lvbihwY2lkZV9iYXNlc1tpXSwgOCwgbmFtZSkpIHsKCQlwcmludGsoImNvdWxkIG5vdCByZXNlcnZlIHBvcnRzICVseC0lbHggZm9yICVzXG4iLAoJCSAgICAgICBwY2lkZV9iYXNlc1tpXSxwY2lkZV9iYXNlc1tpXSs4LG5hbWUpOwoJCWNvbnRpbnVlOwoJfQoJaWYgKCFyZXF1ZXN0X3JlZ2lvbihwY2lkZV9iYXNlc1tpXSsweDIwNiwgMSwgbmFtZSkpIHsKCQlwcmludGsoImNvdWxkIG5vdCByZXNlcnZlIHBvcnQgJWx4IGZvciAlc1xuIiwKCQkgICAgICAgcGNpZGVfYmFzZXNbaV0rMHgyMDYsbmFtZSk7CgkJcmVsZWFzZV9yZWdpb24ocGNpZGVfYmFzZXNbaV0sIDgpOwoJCWNvbnRpbnVlOwoJfQoJcTQwX2lkZV9zZXR1cF9wb3J0cygmaHcsKHVuc2lnbmVkIGxvbmcpIHBjaWRlX2Jhc2VzW2ldLCAoaW50ICopcGNpZGVfb2Zmc2V0cywgCgkJCXBjaWRlX2Jhc2VzW2ldKzB4MjA2LCAKCQkJMCwgTlVMTCwKLy8JCQltNjhraWRlX2lvcHMsCgkJCXE0MGlkZV9kZWZhdWx0X2lycShwY2lkZV9iYXNlc1tpXSkpOwoJaW5kZXggPSBpZGVfcmVnaXN0ZXJfaHcoJmh3LCAmaHdpZik7CgkvLyAqKkZJWE1FKioKCWlmIChpbmRleCAhPSAtMSkKCQlod2lmLT5tbWlvID0gMjsKICAgIH0KfQoK