LyogbWNvb2tpZS5jIC0tIEdlbmVyYXRlcyByYW5kb20gbnVtYmVycyBmb3IgeGF1dGgKICogQ3JlYXRlZDogRnJpIEZlYiAgMyAxMDo0Mjo0OCAxOTk1IGJ5IGZhaXRoQGNzLnVuYy5lZHUKICogUmV2aXNlZDogRnJpIE1hciAxOSAwNzo0ODowMSAxOTk5IGJ5IGZhaXRoQGFjbS5vcmcKICogUHVibGljIERvbWFpbiAxOTk1LCAxOTk5IFJpY2thcmQgRS4gRmFpdGggKGZhaXRoQGFjbS5vcmcpCiAqIFRoaXMgcHJvZ3JhbSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuCiAqIAogKiAkSWQ6IG1jb29raWUuYyx2IDEuNSAxOTk3LzA3LzA2IDAwOjEzOjA2IGFlYnIgRXhwICQKICoKICogVGhpcyBwcm9ncmFtIGdhdGhlcnMgc29tZSByYW5kb20gYml0cyBvZiBkYXRhIGFuZCB1c2VkIHRoZSBNRDUKICogbWVzc2FnZS1kaWdlc3QgYWxnb3JpdGhtIHRvIGdlbmVyYXRlIGEgMTI4LWJpdCBoZXhhZGVjaW1hbCBudW1iZXIgZm9yCiAqIHVzZSB3aXRoIHhhdXRoKDEpLgogKgogKiBOT1RFOiBVbmxlc3MgL2Rldi9yYW5kb20gaXMgYXZhaWxhYmxlLCB0aGlzIHByb2dyYW0gZG9lcyBub3QgYWN0dWFsbHkKICogZ2F0aGVyIDEyOCBiaXRzIG9mIHJhbmRvbSBpbmZvcm1hdGlvbiwgc28gdGhlIG1hZ2ljIGNvb2tpZSBnZW5lcmF0ZWQKICogd2lsbCBiZSBjb25zaWRlcmFibHkgZWFzaWVyIHRvIGd1ZXNzIHRoYW4gb25lIG1pZ2h0IGV4cGVjdC4KICoKICogMTk5OS0wMi0yMiBBcmthZGl1c3ogTWm2a2lld2ljeiA8bWlzaWVrQHBsZC5PUkcuUEw+CiAqIC0gYWRkZWQgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQKICogMTk5OS0wMy0yMSBhZWI6IEFkZGVkIHNvbWUgZnJhZ21lbnRzIG9mIGNvZGUgZnJvbSBDb2xpbiBQbHVtYi4KICoKICovCgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8ZmNudGwuaD4KI2luY2x1ZGUgPHN5cy90aW1lLmg+CiNpbmNsdWRlIDx0aW1lLmg+CiNpbmNsdWRlIDx1bmlzdGQuaD4KCiNkZWZpbmUgQlVGRkVSU0laRSA0MDk2CgoKI2lmbmRlZiBNRDVfSAojZGVmaW5lIE1ENV9ICgojaWYgZGVmaW5lZCAoX19hbHBoYV9fKSB8fCBkZWZpbmVkIChfX2lhNjRfXykgfHwgZGVmaW5lZCAoX194ODZfNjRfXykKdHlwZWRlZiB1bnNpZ25lZCBpbnQgdWludDMyOwojZWxzZQp0eXBlZGVmIHVuc2lnbmVkIGxvbmcgdWludDMyOwojZW5kaWYKCnN0cnVjdCBNRDVDb250ZXh0IHsKCXVpbnQzMiBidWZbNF07Cgl1aW50MzIgYml0c1syXTsKCXVuc2lnbmVkIGNoYXIgaW5bNjRdOwp9OwoKdm9pZCBNRDVJbml0KHN0cnVjdCBNRDVDb250ZXh0ICpjb250ZXh0KTsKdm9pZCBNRDVVcGRhdGUoc3RydWN0IE1ENUNvbnRleHQgKmNvbnRleHQsIHVuc2lnbmVkIGNoYXIgY29uc3QgKmJ1ZiwKCSAgICAgICB1bnNpZ25lZCBsZW4pOwp2b2lkIE1ENUZpbmFsKHVuc2lnbmVkIGNoYXIgZGlnZXN0WzE2XSwgc3RydWN0IE1ENUNvbnRleHQgKmNvbnRleHQpOwp2b2lkIE1ENVRyYW5zZm9ybSh1aW50MzIgYnVmWzRdLCB1aW50MzIgY29uc3QgaW5bMTZdKTsKCi8qCiAqIFRoaXMgaXMgbmVlZGVkIHRvIG1ha2UgUlNBUkVGIGhhcHB5IG9uIHNvbWUgTVMtRE9TIGNvbXBpbGVycy4KICovCnR5cGVkZWYgc3RydWN0IE1ENUNvbnRleHQgTUQ1X0NUWDsKCiNlbmRpZiAvKiAhTUQ1X0ggKi8KCgoKLyoKICogVGhpcyBjb2RlIGltcGxlbWVudHMgdGhlIE1ENSBtZXNzYWdlLWRpZ2VzdCBhbGdvcml0aG0uCiAqIFRoZSBhbGdvcml0aG0gaXMgZHVlIHRvIFJvbiBSaXZlc3QuICBUaGlzIGNvZGUgd2FzCiAqIHdyaXR0ZW4gYnkgQ29saW4gUGx1bWIgaW4gMTk5Mywgbm8gY29weXJpZ2h0IGlzIGNsYWltZWQuCiAqIFRoaXMgY29kZSBpcyBpbiB0aGUgcHVibGljIGRvbWFpbjsgZG8gd2l0aCBpdCB3aGF0IHlvdSB3aXNoLgogKgogKiBFcXVpdmFsZW50IGNvZGUgaXMgYXZhaWxhYmxlIGZyb20gUlNBIERhdGEgU2VjdXJpdHksIEluYy4KICogVGhpcyBjb2RlIGhhcyBiZWVuIHRlc3RlZCBhZ2FpbnN0IHRoYXQsIGFuZCBpcyBlcXVpdmFsZW50LAogKiBleGNlcHQgdGhhdCB5b3UgZG9uJ3QgbmVlZCB0byBpbmNsdWRlIHR3byBwYWdlcyBvZiBsZWdhbGVzZQogKiB3aXRoIGV2ZXJ5IGNvcHkuCiAqCiAqIFRvIGNvbXB1dGUgdGhlIG1lc3NhZ2UgZGlnZXN0IG9mIGEgY2h1bmsgb2YgYnl0ZXMsIGRlY2xhcmUgYW4KICogTUQ1Q29udGV4dCBzdHJ1Y3R1cmUsIHBhc3MgaXQgdG8gTUQ1SW5pdCwgY2FsbCBNRDVVcGRhdGUgYXMKICogbmVlZGVkIG9uIGJ1ZmZlcnMgZnVsbCBvZiBieXRlcywgYW5kIHRoZW4gY2FsbCBNRDVGaW5hbCwgd2hpY2gKICogd2lsbCBmaWxsIGEgc3VwcGxpZWQgMTYtYnl0ZSBhcnJheSB3aXRoIHRoZSBkaWdlc3QuCiAqLwojaW5jbHVkZSA8c3RyaW5nLmg+CQkvKiBmb3IgbWVtY3B5KCkgKi8KI2luY2x1ZGUgPGVuZGlhbi5oPgoKI2lmIF9fQllURV9PUkRFUiA9PSBfX0xJVFRMRV9FTkRJQU4KI2RlZmluZSBieXRlUmV2ZXJzZShidWYsIGxlbikJLyogTm90aGluZyAqLwojZWxzZQp2b2lkIGJ5dGVSZXZlcnNlKHVuc2lnbmVkIGNoYXIgKmJ1ZiwgdW5zaWduZWQgbG9uZ3MpOwoKLyoKICogTm90ZTogdGhpcyBjb2RlIGlzIGhhcm1sZXNzIG9uIGxpdHRsZS1lbmRpYW4gbWFjaGluZXMuCiAqLwp2b2lkIGJ5dGVSZXZlcnNlKHVuc2lnbmVkIGNoYXIgKmJ1ZiwgdW5zaWduZWQgbG9uZ3MpCnsKICAgIHVpbnQzMiB0OwogICAgZG8gewoJdCA9ICh1aW50MzIpICgodW5zaWduZWQpIGJ1ZlszXSA8PCA4IHwgYnVmWzJdKSA8PCAxNiB8CgkgICAgKCh1bnNpZ25lZCkgYnVmWzFdIDw8IDggfCBidWZbMF0pOwoJKih1aW50MzIgKikgYnVmID0gdDsKCWJ1ZiArPSA0OwogICAgfSB3aGlsZSAoLS1sb25ncyk7Cn0KI2VuZGlmCgovKgogKiBTdGFydCBNRDUgYWNjdW11bGF0aW9uLiAgU2V0IGJpdCBjb3VudCB0byAwIGFuZCBidWZmZXIgdG8gbXlzdGVyaW91cwogKiBpbml0aWFsaXphdGlvbiBjb25zdGFudHMuCiAqLwp2b2lkIE1ENUluaXQoc3RydWN0IE1ENUNvbnRleHQgKmN0eCkKewogICAgY3R4LT5idWZbMF0gPSAweDY3NDUyMzAxOwogICAgY3R4LT5idWZbMV0gPSAweGVmY2RhYjg5OwogICAgY3R4LT5idWZbMl0gPSAweDk4YmFkY2ZlOwogICAgY3R4LT5idWZbM10gPSAweDEwMzI1NDc2OwoKICAgIGN0eC0+Yml0c1swXSA9IDA7CiAgICBjdHgtPmJpdHNbMV0gPSAwOwp9CgovKgogKiBVcGRhdGUgY29udGV4dCB0byByZWZsZWN0IHRoZSBjb25jYXRlbmF0aW9uIG9mIGFub3RoZXIgYnVmZmVyIGZ1bGwKICogb2YgYnl0ZXMuCiAqLwp2b2lkIE1ENVVwZGF0ZShzdHJ1Y3QgTUQ1Q29udGV4dCAqY3R4LCB1bnNpZ25lZCBjaGFyIGNvbnN0ICpidWYsIHVuc2lnbmVkIGxlbikKewogICAgdWludDMyIHQ7CgogICAgLyogVXBkYXRlIGJpdGNvdW50ICovCgogICAgdCA9IGN0eC0+Yml0c1swXTsKICAgIGlmICgoY3R4LT5iaXRzWzBdID0gdCArICgodWludDMyKSBsZW4gPDwgMykpIDwgdCkKCWN0eC0+Yml0c1sxXSsrOwkJLyogQ2FycnkgZnJvbSBsb3cgdG8gaGlnaCAqLwogICAgY3R4LT5iaXRzWzFdICs9IGxlbiA+PiAyOTsKCiAgICB0ID0gKHQgPj4gMykgJiAweDNmOwkvKiBCeXRlcyBhbHJlYWR5IGluIHNoc0luZm8tPmRhdGEgKi8KCiAgICAvKiBIYW5kbGUgYW55IGxlYWRpbmcgb2RkLXNpemVkIGNodW5rcyAqLwoKICAgIGlmICh0KSB7Cgl1bnNpZ25lZCBjaGFyICpwID0gKHVuc2lnbmVkIGNoYXIgKikgY3R4LT5pbiArIHQ7CgoJdCA9IDY0IC0gdDsKCWlmIChsZW4gPCB0KSB7CgkgICAgbWVtY3B5KHAsIGJ1ZiwgbGVuKTsKCSAgICByZXR1cm47Cgl9CgltZW1jcHkocCwgYnVmLCB0KTsKCWJ5dGVSZXZlcnNlKGN0eC0+aW4sIDE2KTsKCU1ENVRyYW5zZm9ybShjdHgtPmJ1ZiwgKHVpbnQzMiAqKSBjdHgtPmluKTsKCWJ1ZiArPSB0OwoJbGVuIC09IHQ7CiAgICB9CiAgICAvKiBQcm9jZXNzIGRhdGEgaW4gNjQtYnl0ZSBjaHVua3MgKi8KCiAgICB3aGlsZSAobGVuID49IDY0KSB7CgltZW1jcHkoY3R4LT5pbiwgYnVmLCA2NCk7CglieXRlUmV2ZXJzZShjdHgtPmluLCAxNik7CglNRDVUcmFuc2Zvcm0oY3R4LT5idWYsICh1aW50MzIgKikgY3R4LT5pbik7CglidWYgKz0gNjQ7CglsZW4gLT0gNjQ7CiAgICB9CgogICAgLyogSGFuZGxlIGFueSByZW1haW5pbmcgYnl0ZXMgb2YgZGF0YS4gKi8KCiAgICBtZW1jcHkoY3R4LT5pbiwgYnVmLCBsZW4pOwp9CgovKgogKiBGaW5hbCB3cmFwdXAgLSBwYWQgdG8gNjQtYnl0ZSBib3VuZGFyeSB3aXRoIHRoZSBiaXQgcGF0dGVybiAKICogMSAwKiAoNjQtYml0IGNvdW50IG9mIGJpdHMgcHJvY2Vzc2VkLCBNU0ItZmlyc3QpCiAqLwp2b2lkIE1ENUZpbmFsKHVuc2lnbmVkIGNoYXIgZGlnZXN0WzE2XSwgc3RydWN0IE1ENUNvbnRleHQgKmN0eCkKewogICAgdW5zaWduZWQgY291bnQ7CiAgICB1bnNpZ25lZCBjaGFyICpwOwoKICAgIC8qIENvbXB1dGUgbnVtYmVyIG9mIGJ5dGVzIG1vZCA2NCAqLwogICAgY291bnQgPSAoY3R4LT5iaXRzWzBdID4+IDMpICYgMHgzRjsKCiAgICAvKiBTZXQgdGhlIGZpcnN0IGNoYXIgb2YgcGFkZGluZyB0byAweDgwLiAgVGhpcyBpcyBzYWZlIHNpbmNlIHRoZXJlIGlzCiAgICAgICBhbHdheXMgYXQgbGVhc3Qgb25lIGJ5dGUgZnJlZSAqLwogICAgcCA9IGN0eC0+aW4gKyBjb3VudDsKICAgICpwKysgPSAweDgwOwoKICAgIC8qIEJ5dGVzIG9mIHBhZGRpbmcgbmVlZGVkIHRvIG1ha2UgNjQgYnl0ZXMgKi8KICAgIGNvdW50ID0gNjQgLSAxIC0gY291bnQ7CgogICAgLyogUGFkIG91dCB0byA1NiBtb2QgNjQgKi8KICAgIGlmIChjb3VudCA8IDgpIHsKCS8qIFR3byBsb3RzIG9mIHBhZGRpbmc6ICBQYWQgdGhlIGZpcnN0IGJsb2NrIHRvIDY0IGJ5dGVzICovCgltZW1zZXQocCwgMCwgY291bnQpOwoJYnl0ZVJldmVyc2UoY3R4LT5pbiwgMTYpOwoJTUQ1VHJhbnNmb3JtKGN0eC0+YnVmLCAodWludDMyICopIGN0eC0+aW4pOwoKCS8qIE5vdyBmaWxsIHRoZSBuZXh0IGJsb2NrIHdpdGggNTYgYnl0ZXMgKi8KCW1lbXNldChjdHgtPmluLCAwLCA1Nik7CiAgICB9IGVsc2UgewoJLyogUGFkIGJsb2NrIHRvIDU2IGJ5dGVzICovCgltZW1zZXQocCwgMCwgY291bnQgLSA4KTsKICAgIH0KICAgIGJ5dGVSZXZlcnNlKGN0eC0+aW4sIDE0KTsKCiAgICAvKiBBcHBlbmQgbGVuZ3RoIGluIGJpdHMgYW5kIHRyYW5zZm9ybSAqLwogICAgKCh1aW50MzIgKikgY3R4LT5pbilbMTRdID0gY3R4LT5iaXRzWzBdOwogICAgKCh1aW50MzIgKikgY3R4LT5pbilbMTVdID0gY3R4LT5iaXRzWzFdOwoKICAgIE1ENVRyYW5zZm9ybShjdHgtPmJ1ZiwgKHVpbnQzMiAqKSBjdHgtPmluKTsKICAgIGJ5dGVSZXZlcnNlKCh1bnNpZ25lZCBjaGFyICopIGN0eC0+YnVmLCA0KTsKICAgIG1lbWNweShkaWdlc3QsIGN0eC0+YnVmLCAxNik7CiAgICBtZW1zZXQoY3R4LCAwLCBzaXplb2YoY3R4KSk7CS8qIEluIGNhc2UgaXQncyBzZW5zaXRpdmUgKi8KfQoKLyogVGhlIGZvdXIgY29yZSBmdW5jdGlvbnMgLSBGMSBpcyBvcHRpbWl6ZWQgc29tZXdoYXQgKi8KCi8qICNkZWZpbmUgRjEoeCwgeSwgeikgKHggJiB5IHwgfnggJiB6KSAqLwojZGVmaW5lIEYxKHgsIHksIHopICh6IF4gKHggJiAoeSBeIHopKSkKI2RlZmluZSBGMih4LCB5LCB6KSBGMSh6LCB4LCB5KQojZGVmaW5lIEYzKHgsIHksIHopICh4IF4geSBeIHopCiNkZWZpbmUgRjQoeCwgeSwgeikgKHkgXiAoeCB8IH56KSkKCi8qIFRoaXMgaXMgdGhlIGNlbnRyYWwgc3RlcCBpbiB0aGUgTUQ1IGFsZ29yaXRobS4gKi8KI2RlZmluZSBNRDVTVEVQKGYsIHcsIHgsIHksIHosIGRhdGEsIHMpIFwKCSggdyArPSBmKHgsIHksIHopICsgZGF0YSwgIHcgPSB3PDxzIHwgdz4+KDMyLXMpLCAgdyArPSB4ICkKCi8qCiAqIFRoZSBjb3JlIG9mIHRoZSBNRDUgYWxnb3JpdGhtLCB0aGlzIGFsdGVycyBhbiBleGlzdGluZyBNRDUgaGFzaCB0bwogKiByZWZsZWN0IHRoZSBhZGRpdGlvbiBvZiAxNiBsb25nd29yZHMgb2YgbmV3IGRhdGEuICBNRDVVcGRhdGUgYmxvY2tzCiAqIHRoZSBkYXRhIGFuZCBjb252ZXJ0cyBieXRlcyBpbnRvIGxvbmd3b3JkcyBmb3IgdGhpcyByb3V0aW5lLgogKi8Kdm9pZCBNRDVUcmFuc2Zvcm0odWludDMyIGJ1Zls0XSwgdWludDMyIGNvbnN0IGluWzE2XSkKewogICAgcmVnaXN0ZXIgdWludDMyIGEsIGIsIGMsIGQ7CgogICAgYSA9IGJ1ZlswXTsKICAgIGIgPSBidWZbMV07CiAgICBjID0gYnVmWzJdOwogICAgZCA9IGJ1ZlszXTsKCiAgICBNRDVTVEVQKEYxLCBhLCBiLCBjLCBkLCBpblswXSArIDB4ZDc2YWE0NzgsIDcpOwogICAgTUQ1U1RFUChGMSwgZCwgYSwgYiwgYywgaW5bMV0gKyAweGU4YzdiNzU2LCAxMik7CiAgICBNRDVTVEVQKEYxLCBjLCBkLCBhLCBiLCBpblsyXSArIDB4MjQyMDcwZGIsIDE3KTsKICAgIE1ENVNURVAoRjEsIGIsIGMsIGQsIGEsIGluWzNdICsgMHhjMWJkY2VlZSwgMjIpOwogICAgTUQ1U1RFUChGMSwgYSwgYiwgYywgZCwgaW5bNF0gKyAweGY1N2MwZmFmLCA3KTsKICAgIE1ENVNURVAoRjEsIGQsIGEsIGIsIGMsIGluWzVdICsgMHg0Nzg3YzYyYSwgMTIpOwogICAgTUQ1U1RFUChGMSwgYywgZCwgYSwgYiwgaW5bNl0gKyAweGE4MzA0NjEzLCAxNyk7CiAgICBNRDVTVEVQKEYxLCBiLCBjLCBkLCBhLCBpbls3XSArIDB4ZmQ0Njk1MDEsIDIyKTsKICAgIE1ENVNURVAoRjEsIGEsIGIsIGMsIGQsIGluWzhdICsgMHg2OTgwOThkOCwgNyk7CiAgICBNRDVTVEVQKEYxLCBkLCBhLCBiLCBjLCBpbls5XSArIDB4OGI0NGY3YWYsIDEyKTsKICAgIE1ENVNURVAoRjEsIGMsIGQsIGEsIGIsIGluWzEwXSArIDB4ZmZmZjViYjEsIDE3KTsKICAgIE1ENVNURVAoRjEsIGIsIGMsIGQsIGEsIGluWzExXSArIDB4ODk1Y2Q3YmUsIDIyKTsKICAgIE1ENVNURVAoRjEsIGEsIGIsIGMsIGQsIGluWzEyXSArIDB4NmI5MDExMjIsIDcpOwogICAgTUQ1U1RFUChGMSwgZCwgYSwgYiwgYywgaW5bMTNdICsgMHhmZDk4NzE5MywgMTIpOwogICAgTUQ1U1RFUChGMSwgYywgZCwgYSwgYiwgaW5bMTRdICsgMHhhNjc5NDM4ZSwgMTcpOwogICAgTUQ1U1RFUChGMSwgYiwgYywgZCwgYSwgaW5bMTVdICsgMHg0OWI0MDgyMSwgMjIpOwoKICAgIE1ENVNURVAoRjIsIGEsIGIsIGMsIGQsIGluWzFdICsgMHhmNjFlMjU2MiwgNSk7CiAgICBNRDVTVEVQKEYyLCBkLCBhLCBiLCBjLCBpbls2XSArIDB4YzA0MGIzNDAsIDkpOwogICAgTUQ1U1RFUChGMiwgYywgZCwgYSwgYiwgaW5bMTFdICsgMHgyNjVlNWE1MSwgMTQpOwogICAgTUQ1U1RFUChGMiwgYiwgYywgZCwgYSwgaW5bMF0gKyAweGU5YjZjN2FhLCAyMCk7CiAgICBNRDVTVEVQKEYyLCBhLCBiLCBjLCBkLCBpbls1XSArIDB4ZDYyZjEwNWQsIDUpOwogICAgTUQ1U1RFUChGMiwgZCwgYSwgYiwgYywgaW5bMTBdICsgMHgwMjQ0MTQ1MywgOSk7CiAgICBNRDVTVEVQKEYyLCBjLCBkLCBhLCBiLCBpblsxNV0gKyAweGQ4YTFlNjgxLCAxNCk7CiAgICBNRDVTVEVQKEYyLCBiLCBjLCBkLCBhLCBpbls0XSArIDB4ZTdkM2ZiYzgsIDIwKTsKICAgIE1ENVNURVAoRjIsIGEsIGIsIGMsIGQsIGluWzldICsgMHgyMWUxY2RlNiwgNSk7CiAgICBNRDVTVEVQKEYyLCBkLCBhLCBiLCBjLCBpblsxNF0gKyAweGMzMzcwN2Q2LCA5KTsKICAgIE1ENVNURVAoRjIsIGMsIGQsIGEsIGIsIGluWzNdICsgMHhmNGQ1MGQ4NywgMTQpOwogICAgTUQ1U1RFUChGMiwgYiwgYywgZCwgYSwgaW5bOF0gKyAweDQ1NWExNGVkLCAyMCk7CiAgICBNRDVTVEVQKEYyLCBhLCBiLCBjLCBkLCBpblsxM10gKyAweGE5ZTNlOTA1LCA1KTsKICAgIE1ENVNURVAoRjIsIGQsIGEsIGIsIGMsIGluWzJdICsgMHhmY2VmYTNmOCwgOSk7CiAgICBNRDVTVEVQKEYyLCBjLCBkLCBhLCBiLCBpbls3XSArIDB4Njc2ZjAyZDksIDE0KTsKICAgIE1ENVNURVAoRjIsIGIsIGMsIGQsIGEsIGluWzEyXSArIDB4OGQyYTRjOGEsIDIwKTsKCiAgICBNRDVTVEVQKEYzLCBhLCBiLCBjLCBkLCBpbls1XSArIDB4ZmZmYTM5NDIsIDQpOwogICAgTUQ1U1RFUChGMywgZCwgYSwgYiwgYywgaW5bOF0gKyAweDg3NzFmNjgxLCAxMSk7CiAgICBNRDVTVEVQKEYzLCBjLCBkLCBhLCBiLCBpblsxMV0gKyAweDZkOWQ2MTIyLCAxNik7CiAgICBNRDVTVEVQKEYzLCBiLCBjLCBkLCBhLCBpblsxNF0gKyAweGZkZTUzODBjLCAyMyk7CiAgICBNRDVTVEVQKEYzLCBhLCBiLCBjLCBkLCBpblsxXSArIDB4YTRiZWVhNDQsIDQpOwogICAgTUQ1U1RFUChGMywgZCwgYSwgYiwgYywgaW5bNF0gKyAweDRiZGVjZmE5LCAxMSk7CiAgICBNRDVTVEVQKEYzLCBjLCBkLCBhLCBiLCBpbls3XSArIDB4ZjZiYjRiNjAsIDE2KTsKICAgIE1ENVNURVAoRjMsIGIsIGMsIGQsIGEsIGluWzEwXSArIDB4YmViZmJjNzAsIDIzKTsKICAgIE1ENVNURVAoRjMsIGEsIGIsIGMsIGQsIGluWzEzXSArIDB4Mjg5YjdlYzYsIDQpOwogICAgTUQ1U1RFUChGMywgZCwgYSwgYiwgYywgaW5bMF0gKyAweGVhYTEyN2ZhLCAxMSk7CiAgICBNRDVTVEVQKEYzLCBjLCBkLCBhLCBiLCBpblszXSArIDB4ZDRlZjMwODUsIDE2KTsKICAgIE1ENVNURVAoRjMsIGIsIGMsIGQsIGEsIGluWzZdICsgMHgwNDg4MWQwNSwgMjMpOwogICAgTUQ1U1RFUChGMywgYSwgYiwgYywgZCwgaW5bOV0gKyAweGQ5ZDRkMDM5LCA0KTsKICAgIE1ENVNURVAoRjMsIGQsIGEsIGIsIGMsIGluWzEyXSArIDB4ZTZkYjk5ZTUsIDExKTsKICAgIE1ENVNURVAoRjMsIGMsIGQsIGEsIGIsIGluWzE1XSArIDB4MWZhMjdjZjgsIDE2KTsKICAgIE1ENVNURVAoRjMsIGIsIGMsIGQsIGEsIGluWzJdICsgMHhjNGFjNTY2NSwgMjMpOwoKICAgIE1ENVNURVAoRjQsIGEsIGIsIGMsIGQsIGluWzBdICsgMHhmNDI5MjI0NCwgNik7CiAgICBNRDVTVEVQKEY0LCBkLCBhLCBiLCBjLCBpbls3XSArIDB4NDMyYWZmOTcsIDEwKTsKICAgIE1ENVNURVAoRjQsIGMsIGQsIGEsIGIsIGluWzE0XSArIDB4YWI5NDIzYTcsIDE1KTsKICAgIE1ENVNURVAoRjQsIGIsIGMsIGQsIGEsIGluWzVdICsgMHhmYzkzYTAzOSwgMjEpOwogICAgTUQ1U1RFUChGNCwgYSwgYiwgYywgZCwgaW5bMTJdICsgMHg2NTViNTljMywgNik7CiAgICBNRDVTVEVQKEY0LCBkLCBhLCBiLCBjLCBpblszXSArIDB4OGYwY2NjOTIsIDEwKTsKICAgIE1ENVNURVAoRjQsIGMsIGQsIGEsIGIsIGluWzEwXSArIDB4ZmZlZmY0N2QsIDE1KTsKICAgIE1ENVNURVAoRjQsIGIsIGMsIGQsIGEsIGluWzFdICsgMHg4NTg0NWRkMSwgMjEpOwogICAgTUQ1U1RFUChGNCwgYSwgYiwgYywgZCwgaW5bOF0gKyAweDZmYTg3ZTRmLCA2KTsKICAgIE1ENVNURVAoRjQsIGQsIGEsIGIsIGMsIGluWzE1XSArIDB4ZmUyY2U2ZTAsIDEwKTsKICAgIE1ENVNURVAoRjQsIGMsIGQsIGEsIGIsIGluWzZdICsgMHhhMzAxNDMxNCwgMTUpOwogICAgTUQ1U1RFUChGNCwgYiwgYywgZCwgYSwgaW5bMTNdICsgMHg0ZTA4MTFhMSwgMjEpOwogICAgTUQ1U1RFUChGNCwgYSwgYiwgYywgZCwgaW5bNF0gKyAweGY3NTM3ZTgyLCA2KTsKICAgIE1ENVNURVAoRjQsIGQsIGEsIGIsIGMsIGluWzExXSArIDB4YmQzYWYyMzUsIDEwKTsKICAgIE1ENVNURVAoRjQsIGMsIGQsIGEsIGIsIGluWzJdICsgMHgyYWQ3ZDJiYiwgMTUpOwogICAgTUQ1U1RFUChGNCwgYiwgYywgZCwgYSwgaW5bOV0gKyAweGViODZkMzkxLCAyMSk7CgogICAgYnVmWzBdICs9IGE7CiAgICBidWZbMV0gKz0gYjsKICAgIGJ1ZlsyXSArPSBjOwogICAgYnVmWzNdICs9IGQ7Cn0KCgoKCnN0cnVjdCBybmdzIHsKICAgY29uc3QgY2hhciAqcGF0aDsKICAgaW50IG1pbmxlbmd0aCwgbWF4bGVuZ3RoOwp9IHJuZ3NbXSA9IHsKICAgeyAiL2Rldi9yYW5kb20iLCAgICAgICAgICAgICAgMTYsICAxNiB9LCAvKiAxNiBieXRlcyA9IDEyOCBiaXRzIHN1ZmZpY2UgKi8KICAgeyAiL3Byb2MvaW50ZXJydXB0cyIsICAgICAgICAgIDAsICAgMCB9LAogICB7ICIvcHJvYy9zbGFiaW5mbyIsICAgICAgICAgICAgMCwgICAwIH0sCiAgIHsgIi9wcm9jL3N0YXQiLCAgICAgICAgICAgICAgICAwLCAgIDAgfSwKICAgeyAiL2Rldi91cmFuZG9tIiwgICAgICAgICAgICAgMzIsICA2NCB9LAp9OwojZGVmaW5lIFJOR1MgKHNpemVvZihybmdzKS9zaXplb2Yoc3RydWN0IHJuZ3MpKQoKaW50IFZlcmJvc2UgPSAwOwoKLyogVGhlIGJhc2ljIGZ1bmN0aW9uIHRvIGhhc2ggYSBmaWxlICovCnN0YXRpYyBvZmZfdApoYXNoX2ZpbGUoc3RydWN0IE1ENUNvbnRleHQgKmN0eCwgaW50IGZkKQp7CiAgIG9mZl90IGNvdW50ID0gMDsKICAgc3NpemVfdCByOwogICB1bnNpZ25lZCBjaGFyIGJ1ZltCVUZGRVJTSVpFXTsKCiAgIHdoaWxlICgociA9IHJlYWQoZmQsIGJ1Ziwgc2l6ZW9mKGJ1ZikpKSA+IDApIHsKICAgICAgTUQ1VXBkYXRlKGN0eCwgYnVmLCByKTsKICAgICAgY291bnQgKz0gcjsKICAgfQogICAvKiBTZXBhcmF0ZSBmaWxlcyB3aXRoIGEgbnVsbCBieXRlICovCiAgIGJ1ZlswXSA9IDA7CiAgIE1ENVVwZGF0ZShjdHgsIGJ1ZiwgMSk7CiAgIHJldHVybiBjb3VudDsKfQoKaW50IG1haW4oIGludCBhcmdjLCBjaGFyICoqYXJndiApCnsKICAgaW50ICAgICAgICAgICAgICAgaTsKICAgc3RydWN0IE1ENUNvbnRleHQgY3R4OwogICB1bnNpZ25lZCBjaGFyICAgICBkaWdlc3RbMTZdOwogICB1bnNpZ25lZCBjaGFyICAgICBidWZbQlVGRkVSU0laRV07CiAgIGludCAgICAgICAgICAgICAgIGZkOwogICBpbnQgICAgICAgICAgICAgICBjOwogICBwaWRfdCAgICAgICAgICAgICBwaWQ7CiAgIGNoYXIgICAgICAgICAgICAgICpmaWxlID0gTlVMTDsKICAgaW50ICAgICAgICAgICAgICAgcjsKICAgc3RydWN0IHRpbWV2YWwgICAgdHY7CiAgIHN0cnVjdCB0aW1lem9uZSAgIHR6OwoKICAgd2hpbGUgKChjID0gZ2V0b3B0KCBhcmdjLCBhcmd2LCAidmY6IiApKSAhPSAtMSkKICAgICAgc3dpdGNoIChjKSB7CiAgICAgIGNhc2UgJ3YnOiArK1ZlcmJvc2U7ICAgICBicmVhazsKICAgICAgY2FzZSAnZic6IGZpbGUgPSBvcHRhcmc7IGJyZWFrOwogICAgICB9CgogICBNRDVJbml0KCAmY3R4ICk7CiAgIAogICBnZXR0aW1lb2ZkYXkoICZ0diwgJnR6ICk7CiAgIE1ENVVwZGF0ZSggJmN0eCwgKHVuc2lnbmVkIGNoYXIgKikmdHYsIHNpemVvZiggdHYgKSApOwogICBwaWQgPSBnZXRwcGlkKCk7CiAgIE1ENVVwZGF0ZSggJmN0eCwgKHVuc2lnbmVkIGNoYXIgKikmcGlkLCBzaXplb2YoIHBpZCApKTsKICAgcGlkID0gZ2V0cGlkKCk7CiAgIE1ENVVwZGF0ZSggJmN0eCwgKHVuc2lnbmVkIGNoYXIgKikmcGlkLCBzaXplb2YoIHBpZCApKTsKCiAgIGlmIChmaWxlKSB7CiAgICAgIGludCBjb3VudCA9IDA7CiAgICAgIAogICAgICBpZiAoZmlsZVswXSA9PSAnLScgJiYgIWZpbGVbMV0pCgkgZmQgPSBmaWxlbm8oc3RkaW4pOwogICAgICBlbHNlCgkgZmQgPSBvcGVuKCBmaWxlLCBPX1JET05MWSApOwoKICAgICAgaWYgKGZkIDwgMCkgewoJIGZwcmludGYoIHN0ZGVyciwgIkNvdWxkIG5vdCBvcGVuICVzXG4iLCBmaWxlICk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgIGNvdW50ID0gaGFzaF9maWxlKCAmY3R4LCBmZCApOwoJIGlmIChWZXJib3NlKQoJICAgIGZwcmludGYoIHN0ZGVyciwgIkdvdCAlZCBieXRlcyBmcm9tICVzXG4iLCBjb3VudCwgZmlsZSApOwoKCSBpZiAoZmlsZVswXSAhPSAnLScgfHwgZmlsZVsxXSkgY2xvc2UoIGZkICk7CiAgICAgIH0KICAgfQoKICAgZm9yIChpID0gMDsgaSA8IFJOR1M7IGkrKykgewogICAgICBpZiAoKGZkID0gb3Blbiggcm5nc1tpXS5wYXRoLCBPX1JET05MWXxPX05PTkJMT0NLICkpID49IDApIHsKCSBpbnQgY291bnQgPSBzaXplb2YoYnVmKTsKCgkgaWYgKHJuZ3NbaV0ubWF4bGVuZ3RoICYmIGNvdW50ID4gcm5nc1tpXS5tYXhsZW5ndGgpCgkgICAgY291bnQgPSBybmdzW2ldLm1heGxlbmd0aDsKCSByID0gcmVhZCggZmQsIGJ1ZiwgY291bnQgKTsKCSBpZiAociA+IDApCgkgICAgTUQ1VXBkYXRlKCAmY3R4LCBidWYsIHIgKTsKCSBlbHNlCgkgICAgciA9IDA7CgkgY2xvc2UoIGZkICk7CgkgaWYgKFZlcmJvc2UpCgkgICAgZnByaW50Ziggc3RkZXJyLCAiR290ICVkIGJ5dGVzIGZyb20gJXNcbiIsIHIsIHJuZ3NbaV0ucGF0aCApOwoJIGlmIChybmdzW2ldLm1pbmxlbmd0aCAmJiByID49IHJuZ3NbaV0ubWlubGVuZ3RoKQoJICAgIGJyZWFrOwogICAgICB9IGVsc2UgaWYgKFZlcmJvc2UpCgkgZnByaW50Ziggc3RkZXJyLCAiQ291bGQgbm90IG9wZW4gJXNcbiIsIHJuZ3NbaV0ucGF0aCApOwogICB9CgogICBNRDVGaW5hbCggZGlnZXN0LCAmY3R4ICk7CiAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSBwcmludGYoICIlMDJ4IiwgZGlnZXN0W2ldICk7CiAgIHB1dGNoYXIgKCAnXG4nICk7CiAgIAogICAvKgogICAgKiBUaGUgZm9sbG93aW5nIGlzIGltcG9ydGFudCBmb3IgY2FzZXMgbGlrZSBkaXNrIGZ1bGwsIHNvIHNoZWxsIHNjcmlwdHMKICAgICogY2FuIGJvbWIgb3V0IHByb3Blcmx5IHJhdGhlciB0aGFuIHRoaW5rIHRoZXkgc3VjY2VlZGVkLgogICAgKi8KICAgaWYgKGZmbHVzaChzdGRvdXQpIDwgMCB8fCBmY2xvc2Uoc3Rkb3V0KSA8IDApCiAgICAgIHJldHVybiAxOwoKICAgcmV0dXJuIDA7Cn0K