LyogbWNvb2tpZS5jIC0tIEdlbmVyYXRlcyByYW5kb20gbnVtYmVycyBmb3IgeGF1dGgKICogQ3JlYXRlZDogRnJpIEZlYiAgMyAxMDo0Mjo0OCAxOTk1IGJ5IGZhaXRoQGNzLnVuYy5lZHUKICogUmV2aXNlZDogRnJpIE1hciAxOSAwNzo0ODowMSAxOTk5IGJ5IGZhaXRoQGFjbS5vcmcKICogUHVibGljIERvbWFpbiAxOTk1LCAxOTk5IFJpY2thcmQgRS4gRmFpdGggKGZhaXRoQGFjbS5vcmcpCiAqIFRoaXMgcHJvZ3JhbSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuCiAqIAogKiAkSWQ6IG1jb29raWUuYyx2IDEuNSAxOTk3LzA3LzA2IDAwOjEzOjA2IGFlYnIgRXhwICQKICoKICogVGhpcyBwcm9ncmFtIGdhdGhlcnMgc29tZSByYW5kb20gYml0cyBvZiBkYXRhIGFuZCB1c2VkIHRoZSBNRDUKICogbWVzc2FnZS1kaWdlc3QgYWxnb3JpdGhtIHRvIGdlbmVyYXRlIGEgMTI4LWJpdCBoZXhhZGVjaW1hbCBudW1iZXIgZm9yCiAqIHVzZSB3aXRoIHhhdXRoKDEpLgogKgogKiBOT1RFOiBVbmxlc3MgL2Rldi9yYW5kb20gaXMgYXZhaWxhYmxlLCB0aGlzIHByb2dyYW0gZG9lcyBub3QgYWN0dWFsbHkKICogZ2F0aGVyIDEyOCBiaXRzIG9mIHJhbmRvbSBpbmZvcm1hdGlvbiwgc28gdGhlIG1hZ2ljIGNvb2tpZSBnZW5lcmF0ZWQKICogd2lsbCBiZSBjb25zaWRlcmFibHkgZWFzaWVyIHRvIGd1ZXNzIHRoYW4gb25lIG1pZ2h0IGV4cGVjdC4KICoKICogMTk5OS0wMi0yMiBBcmthZGl1c3ogTWm2a2lld2ljeiA8bWlzaWVrQHBsZC5PUkcuUEw+CiAqIC0gYWRkZWQgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQKICogMTk5OS0wMy0yMSBhZWI6IEFkZGVkIHNvbWUgZnJhZ21lbnRzIG9mIGNvZGUgZnJvbSBDb2xpbiBQbHVtYi4KICoKICovCgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8ZmNudGwuaD4KI2luY2x1ZGUgPHN5cy90aW1lLmg+CiNpbmNsdWRlIDx0aW1lLmg+CiNpbmNsdWRlIDx1bmlzdGQuaD4KCiNkZWZpbmUgQlVGRkVSU0laRSA0MDk2CgoKI2lmbmRlZiBNRDVfSAojZGVmaW5lIE1ENV9ICgojaWYgZGVmaW5lZCAoX19hbHBoYV9fKSB8fCBkZWZpbmVkIChfX2lhNjRfXykgfHwgZGVmaW5lZCAoX194ODZfNjRfXykKdHlwZWRlZiB1bnNpZ25lZCBpbnQgdWludDMyOwojZWxzZQp0eXBlZGVmIHVuc2lnbmVkIGxvbmcgdWludDMyOwojZW5kaWYKCnN0cnVjdCBNRDVDb250ZXh0IHsKCXVpbnQzMiBidWZbNF07Cgl1aW50MzIgYml0c1syXTsKCXVuc2lnbmVkIGNoYXIgaW5bNjRdOwp9OwoKdm9pZCBNRDVJbml0KHN0cnVjdCBNRDVDb250ZXh0ICpjb250ZXh0KTsKdm9pZCBNRDVVcGRhdGUoc3RydWN0IE1ENUNvbnRleHQgKmNvbnRleHQsIHVuc2lnbmVkIGNoYXIgY29uc3QgKmJ1ZiwKCSAgICAgICB1bnNpZ25lZCBsZW4pOwp2b2lkIE1ENUZpbmFsKHVuc2lnbmVkIGNoYXIgZGlnZXN0WzE2XSwgc3RydWN0IE1ENUNvbnRleHQgKmNvbnRleHQpOwp2b2lkIE1ENVRyYW5zZm9ybSh1aW50MzIgYnVmWzRdLCB1aW50MzIgY29uc3QgaW5bMTZdKTsKCi8qCiAqIFRoaXMgaXMgbmVlZGVkIHRvIG1ha2UgUlNBUkVGIGhhcHB5IG9uIHNvbWUgTVMtRE9TIGNvbXBpbGVycy4KICovCnR5cGVkZWYgc3RydWN0IE1ENUNvbnRleHQgTUQ1X0NUWDsKCiNlbmRpZiAvKiAhTUQ1X0ggKi8KCgoKLyoKICogVGhpcyBjb2RlIGltcGxlbWVudHMgdGhlIE1ENSBtZXNzYWdlLWRpZ2VzdCBhbGdvcml0aG0uCiAqIFRoZSBhbGdvcml0aG0gaXMgZHVlIHRvIFJvbiBSaXZlc3QuICBUaGlzIGNvZGUgd2FzCiAqIHdyaXR0ZW4gYnkgQ29saW4gUGx1bWIgaW4gMTk5Mywgbm8gY29weXJpZ2h0IGlzIGNsYWltZWQuCiAqIFRoaXMgY29kZSBpcyBpbiB0aGUgcHVibGljIGRvbWFpbjsgZG8gd2l0aCBpdCB3aGF0IHlvdSB3aXNoLgogKgogKiBFcXVpdmFsZW50IGNvZGUgaXMgYXZhaWxhYmxlIGZyb20gUlNBIERhdGEgU2VjdXJpdHksIEluYy4KICogVGhpcyBjb2RlIGhhcyBiZWVuIHRlc3RlZCBhZ2FpbnN0IHRoYXQsIGFuZCBpcyBlcXVpdmFsZW50LAogKiBleGNlcHQgdGhhdCB5b3UgZG9uJ3QgbmVlZCB0byBpbmNsdWRlIHR3byBwYWdlcyBvZiBsZWdhbGVzZQogKiB3aXRoIGV2ZXJ5IGNvcHkuCiAqCiAqIFRvIGNvbXB1dGUgdGhlIG1lc3NhZ2UgZGlnZXN0IG9mIGEgY2h1bmsgb2YgYnl0ZXMsIGRlY2xhcmUgYW4KICogTUQ1Q29udGV4dCBzdHJ1Y3R1cmUsIHBhc3MgaXQgdG8gTUQ1SW5pdCwgY2FsbCBNRDVVcGRhdGUgYXMKICogbmVlZGVkIG9uIGJ1ZmZlcnMgZnVsbCBvZiBieXRlcywgYW5kIHRoZW4gY2FsbCBNRDVGaW5hbCwgd2hpY2gKICogd2lsbCBmaWxsIGEgc3VwcGxpZWQgMTYtYnl0ZSBhcnJheSB3aXRoIHRoZSBkaWdlc3QuCiAqLwojaW5jbHVkZSA8c3RyaW5nLmg+CQkvKiBmb3IgbWVtY3B5KCkgKi8KI2luY2x1ZGUgPGVuZGlhbi5oPgoKI2lmIF9fQllURV9PUkRFUiA9PSBfX0xJVFRMRV9FTkRJQU4KI2RlZmluZSBieXRlUmV2ZXJzZShidWYsIGxlbikJLyogTm90aGluZyAqLwojZWxzZQp2b2lkIGJ5dGVSZXZlcnNlKHVuc2lnbmVkIGNoYXIgKmJ1ZiwgdW5zaWduZWQgbG9uZ3MpOwoKLyoKICogTm90ZTogdGhpcyBjb2RlIGlzIGhhcm1sZXNzIG9uIGxpdHRsZS1lbmRpYW4gbWFjaGluZXMuCiAqLwp2b2lkIGJ5dGVSZXZlcnNlKHVuc2lnbmVkIGNoYXIgKmJ1ZiwgdW5zaWduZWQgbG9uZ3MpCnsKICAgIHVpbnQzMiB0OwogICAgZG8gewoJdCA9ICh1aW50MzIpICgodW5zaWduZWQpIGJ1ZlszXSA8PCA4IHwgYnVmWzJdKSA8PCAxNiB8CgkgICAgKCh1bnNpZ25lZCkgYnVmWzFdIDw8IDggfCBidWZbMF0pOwoJKih1aW50MzIgKikgYnVmID0gdDsKCWJ1ZiArPSA0OwogICAgfSB3aGlsZSAoLS1sb25ncyk7Cn0KI2VuZGlmCgovKgogKiBTdGFydCBNRDUgYWNjdW11bGF0aW9uLiAgU2V0IGJpdCBjb3VudCB0byAwIGFuZCBidWZmZXIgdG8gbXlzdGVyaW91cwogKiBpbml0aWFsaXphdGlvbiBjb25zdGFudHMuCiAqLwp2b2lkIE1ENUluaXQoc3RydWN0IE1ENUNvbnRleHQgKmN0eCkKewogICAgY3R4LT5idWZbMF0gPSAweDY3NDUyMzAxOwogICAgY3R4LT5idWZbMV0gPSAweGVmY2RhYjg5OwogICAgY3R4LT5idWZbMl0gPSAweDk4YmFkY2ZlOwogICAgY3R4LT5idWZbM10gPSAweDEwMzI1NDc2OwoKICAgIGN0eC0+Yml0c1swXSA9IDA7CiAgICBjdHgtPmJpdHNbMV0gPSAwOwp9CgovKgogKiBVcGRhdGUgY29udGV4dCB0byByZWZsZWN0IHRoZSBjb25jYXRlbmF0aW9uIG9mIGFub3RoZXIgYnVmZmVyIGZ1bGwKICogb2YgYnl0ZXMuCiAqLwp2b2lkIE1ENVVwZGF0ZShzdHJ1Y3QgTUQ1Q29udGV4dCAqY3R4LCB1bnNpZ25lZCBjaGFyIGNvbnN0ICpidWYsIHVuc2lnbmVkIGxlbikKewogICAgdWludDMyIHQ7CgogICAgLyogVXBkYXRlIGJpdGNvdW50ICovCgogICAgdCA9IGN0eC0+Yml0c1swXTsKICAgIGlmICgoY3R4LT5iaXRzWzBdID0gdCArICgodWludDMyKSBsZW4gPDwgMykpIDwgdCkKCWN0eC0+Yml0c1sxXSsrOwkJLyogQ2FycnkgZnJvbSBsb3cgdG8gaGlnaCAqLwogICAgY3R4LT5iaXRzWzFdICs9IGxlbiA+PiAyOTsKCiAgICB0ID0gKHQgPj4gMykgJiAweDNmOwkvKiBCeXRlcyBhbHJlYWR5IGluIHNoc0luZm8tPmRhdGEgKi8KCiAgICAvKiBIYW5kbGUgYW55IGxlYWRpbmcgb2RkLXNpemVkIGNodW5rcyAqLwoKICAgIGlmICh0KSB7Cgl1bnNpZ25lZCBjaGFyICpwID0gKHVuc2lnbmVkIGNoYXIgKikgY3R4LT5pbiArIHQ7CgoJdCA9IDY0IC0gdDsKCWlmIChsZW4gPCB0KSB7CgkgICAgbWVtY3B5KHAsIGJ1ZiwgbGVuKTsKCSAgICByZXR1cm47Cgl9CgltZW1jcHkocCwgYnVmLCB0KTsKCWJ5dGVSZXZlcnNlKGN0eC0+aW4sIDE2KTsKCU1ENVRyYW5zZm9ybShjdHgtPmJ1ZiwgKHVpbnQzMiAqKSBjdHgtPmluKTsKCWJ1ZiArPSB0OwoJbGVuIC09IHQ7CiAgICB9CiAgICAvKiBQcm9jZXNzIGRhdGEgaW4gNjQtYnl0ZSBjaHVua3MgKi8KCiAgICB3aGlsZSAobGVuID49IDY0KSB7CgltZW1jcHkoY3R4LT5pbiwgYnVmLCA2NCk7CglieXRlUmV2ZXJzZShjdHgtPmluLCAxNik7CglNRDVUcmFuc2Zvcm0oY3R4LT5idWYsICh1aW50MzIgKikgY3R4LT5pbik7CglidWYgKz0gNjQ7CglsZW4gLT0gNjQ7CiAgICB9CgogICAgLyogSGFuZGxlIGFueSByZW1haW5pbmcgYnl0ZXMgb2YgZGF0YS4gKi8KCiAgICBtZW1jcHkoY3R4LT5pbiwgYnVmLCBsZW4pOwp9CgovKgogKiBGaW5hbCB3cmFwdXAgLSBwYWQgdG8gNjQtYnl0ZSBib3VuZGFyeSB3aXRoIHRoZSBiaXQgcGF0dGVybiAKICogMSAwKiAoNjQtYml0IGNvdW50IG9mIGJpdHMgcHJvY2Vzc2VkLCBNU0ItZmlyc3QpCiAqLwp2b2lkIE1ENUZpbmFsKHVuc2lnbmVkIGNoYXIgZGlnZXN0WzE2XSwgc3RydWN0IE1ENUNvbnRleHQgKmN0eCkKewogICAgdW5zaWduZWQgY291bnQ7CiAgICB1bnNpZ25lZCBjaGFyICpwOwoKICAgIC8qIENvbXB1dGUgbnVtYmVyIG9mIGJ5dGVzIG1vZCA2NCAqLwogICAgY291bnQgPSAoY3R4LT5iaXRzWzBdID4+IDMpICYgMHgzRjsKCiAgICAvKiBTZXQgdGhlIGZpcnN0IGNoYXIgb2YgcGFkZGluZyB0byAweDgwLiAgVGhpcyBpcyBzYWZlIHNpbmNlIHRoZXJlIGlzCiAgICAgICBhbHdheXMgYXQgbGVhc3Qgb25lIGJ5dGUgZnJlZSAqLwogICAgcCA9IGN0eC0+aW4gKyBjb3VudDsKICAgICpwKysgPSAweDgwOwoKICAgIC8qIEJ5dGVzIG9mIHBhZGRpbmcgbmVlZGVkIHRvIG1ha2UgNjQgYnl0ZXMgKi8KICAgIGNvdW50ID0gNjQgLSAxIC0gY291bnQ7CgogICAgLyogUGFkIG91dCB0byA1NiBtb2QgNjQgKi8KICAgIGlmIChjb3VudCA8IDgpIHsKCS8qIFR3byBsb3RzIG9mIHBhZGRpbmc6ICBQYWQgdGhlIGZpcnN0IGJsb2NrIHRvIDY0IGJ5dGVzICovCgltZW1zZXQocCwgMCwgY291bnQpOwoJYnl0ZVJldmVyc2UoY3R4LT5pbiwgMTYpOwoJTUQ1VHJhbnNmb3JtKGN0eC0+YnVmLCAodWludDMyICopIGN0eC0+aW4pOwoKCS8qIE5vdyBmaWxsIHRoZSBuZXh0IGJsb2NrIHdpdGggNTYgYnl0ZXMgKi8KCW1lbXNldChjdHgtPmluLCAwLCA1Nik7CiAgICB9IGVsc2UgewoJLyogUGFkIGJsb2NrIHRvIDU2IGJ5dGVzICovCgltZW1zZXQocCwgMCwgY291bnQgLSA4KTsKICAgIH0KICAgIGJ5dGVSZXZlcnNlKGN0eC0+aW4sIDE0KTsKCiAgICAvKiBBcHBlbmQgbGVuZ3RoIGluIGJpdHMgYW5kIHRyYW5zZm9ybSAqLwogICAgKCh1aW50MzIgKikgY3R4LT5pbilbMTRdID0gY3R4LT5iaXRzWzBdOwogICAgKCh1aW50MzIgKikgY3R4LT5pbilbMTVdID0gY3R4LT5iaXRzWzFdOwoKICAgIE1ENVRyYW5zZm9ybShjdHgtPmJ1ZiwgKHVpbnQzMiAqKSBjdHgtPmluKTsKICAgIGJ5dGVSZXZlcnNlKCh1bnNpZ25lZCBjaGFyICopIGN0eC0+YnVmLCA0KTsKICAgIG1lbWNweShkaWdlc3QsIGN0eC0+YnVmLCAxNik7CiAgICBtZW1zZXQoY3R4LCAwLCBzaXplb2YoKmN0eCkpOwkvKiBJbiBjYXNlIGl0J3Mgc2Vuc2l0aXZlICovCn0KCi8qIFRoZSBmb3VyIGNvcmUgZnVuY3Rpb25zIC0gRjEgaXMgb3B0aW1pemVkIHNvbWV3aGF0ICovCgovKiAjZGVmaW5lIEYxKHgsIHksIHopICh4ICYgeSB8IH54ICYgeikgKi8KI2RlZmluZSBGMSh4LCB5LCB6KSAoeiBeICh4ICYgKHkgXiB6KSkpCiNkZWZpbmUgRjIoeCwgeSwgeikgRjEoeiwgeCwgeSkKI2RlZmluZSBGMyh4LCB5LCB6KSAoeCBeIHkgXiB6KQojZGVmaW5lIEY0KHgsIHksIHopICh5IF4gKHggfCB+eikpCgovKiBUaGlzIGlzIHRoZSBjZW50cmFsIHN0ZXAgaW4gdGhlIE1ENSBhbGdvcml0aG0uICovCiNkZWZpbmUgTUQ1U1RFUChmLCB3LCB4LCB5LCB6LCBkYXRhLCBzKSBcCgkoIHcgKz0gZih4LCB5LCB6KSArIGRhdGEsICB3ID0gdzw8cyB8IHc+PigzMi1zKSwgIHcgKz0geCApCgovKgogKiBUaGUgY29yZSBvZiB0aGUgTUQ1IGFsZ29yaXRobSwgdGhpcyBhbHRlcnMgYW4gZXhpc3RpbmcgTUQ1IGhhc2ggdG8KICogcmVmbGVjdCB0aGUgYWRkaXRpb24gb2YgMTYgbG9uZ3dvcmRzIG9mIG5ldyBkYXRhLiAgTUQ1VXBkYXRlIGJsb2NrcwogKiB0aGUgZGF0YSBhbmQgY29udmVydHMgYnl0ZXMgaW50byBsb25nd29yZHMgZm9yIHRoaXMgcm91dGluZS4KICovCnZvaWQgTUQ1VHJhbnNmb3JtKHVpbnQzMiBidWZbNF0sIHVpbnQzMiBjb25zdCBpblsxNl0pCnsKICAgIHJlZ2lzdGVyIHVpbnQzMiBhLCBiLCBjLCBkOwoKICAgIGEgPSBidWZbMF07CiAgICBiID0gYnVmWzFdOwogICAgYyA9IGJ1ZlsyXTsKICAgIGQgPSBidWZbM107CgogICAgTUQ1U1RFUChGMSwgYSwgYiwgYywgZCwgaW5bMF0gKyAweGQ3NmFhNDc4LCA3KTsKICAgIE1ENVNURVAoRjEsIGQsIGEsIGIsIGMsIGluWzFdICsgMHhlOGM3Yjc1NiwgMTIpOwogICAgTUQ1U1RFUChGMSwgYywgZCwgYSwgYiwgaW5bMl0gKyAweDI0MjA3MGRiLCAxNyk7CiAgICBNRDVTVEVQKEYxLCBiLCBjLCBkLCBhLCBpblszXSArIDB4YzFiZGNlZWUsIDIyKTsKICAgIE1ENVNURVAoRjEsIGEsIGIsIGMsIGQsIGluWzRdICsgMHhmNTdjMGZhZiwgNyk7CiAgICBNRDVTVEVQKEYxLCBkLCBhLCBiLCBjLCBpbls1XSArIDB4NDc4N2M2MmEsIDEyKTsKICAgIE1ENVNURVAoRjEsIGMsIGQsIGEsIGIsIGluWzZdICsgMHhhODMwNDYxMywgMTcpOwogICAgTUQ1U1RFUChGMSwgYiwgYywgZCwgYSwgaW5bN10gKyAweGZkNDY5NTAxLCAyMik7CiAgICBNRDVTVEVQKEYxLCBhLCBiLCBjLCBkLCBpbls4XSArIDB4Njk4MDk4ZDgsIDcpOwogICAgTUQ1U1RFUChGMSwgZCwgYSwgYiwgYywgaW5bOV0gKyAweDhiNDRmN2FmLCAxMik7CiAgICBNRDVTVEVQKEYxLCBjLCBkLCBhLCBiLCBpblsxMF0gKyAweGZmZmY1YmIxLCAxNyk7CiAgICBNRDVTVEVQKEYxLCBiLCBjLCBkLCBhLCBpblsxMV0gKyAweDg5NWNkN2JlLCAyMik7CiAgICBNRDVTVEVQKEYxLCBhLCBiLCBjLCBkLCBpblsxMl0gKyAweDZiOTAxMTIyLCA3KTsKICAgIE1ENVNURVAoRjEsIGQsIGEsIGIsIGMsIGluWzEzXSArIDB4ZmQ5ODcxOTMsIDEyKTsKICAgIE1ENVNURVAoRjEsIGMsIGQsIGEsIGIsIGluWzE0XSArIDB4YTY3OTQzOGUsIDE3KTsKICAgIE1ENVNURVAoRjEsIGIsIGMsIGQsIGEsIGluWzE1XSArIDB4NDliNDA4MjEsIDIyKTsKCiAgICBNRDVTVEVQKEYyLCBhLCBiLCBjLCBkLCBpblsxXSArIDB4ZjYxZTI1NjIsIDUpOwogICAgTUQ1U1RFUChGMiwgZCwgYSwgYiwgYywgaW5bNl0gKyAweGMwNDBiMzQwLCA5KTsKICAgIE1ENVNURVAoRjIsIGMsIGQsIGEsIGIsIGluWzExXSArIDB4MjY1ZTVhNTEsIDE0KTsKICAgIE1ENVNURVAoRjIsIGIsIGMsIGQsIGEsIGluWzBdICsgMHhlOWI2YzdhYSwgMjApOwogICAgTUQ1U1RFUChGMiwgYSwgYiwgYywgZCwgaW5bNV0gKyAweGQ2MmYxMDVkLCA1KTsKICAgIE1ENVNURVAoRjIsIGQsIGEsIGIsIGMsIGluWzEwXSArIDB4MDI0NDE0NTMsIDkpOwogICAgTUQ1U1RFUChGMiwgYywgZCwgYSwgYiwgaW5bMTVdICsgMHhkOGExZTY4MSwgMTQpOwogICAgTUQ1U1RFUChGMiwgYiwgYywgZCwgYSwgaW5bNF0gKyAweGU3ZDNmYmM4LCAyMCk7CiAgICBNRDVTVEVQKEYyLCBhLCBiLCBjLCBkLCBpbls5XSArIDB4MjFlMWNkZTYsIDUpOwogICAgTUQ1U1RFUChGMiwgZCwgYSwgYiwgYywgaW5bMTRdICsgMHhjMzM3MDdkNiwgOSk7CiAgICBNRDVTVEVQKEYyLCBjLCBkLCBhLCBiLCBpblszXSArIDB4ZjRkNTBkODcsIDE0KTsKICAgIE1ENVNURVAoRjIsIGIsIGMsIGQsIGEsIGluWzhdICsgMHg0NTVhMTRlZCwgMjApOwogICAgTUQ1U1RFUChGMiwgYSwgYiwgYywgZCwgaW5bMTNdICsgMHhhOWUzZTkwNSwgNSk7CiAgICBNRDVTVEVQKEYyLCBkLCBhLCBiLCBjLCBpblsyXSArIDB4ZmNlZmEzZjgsIDkpOwogICAgTUQ1U1RFUChGMiwgYywgZCwgYSwgYiwgaW5bN10gKyAweDY3NmYwMmQ5LCAxNCk7CiAgICBNRDVTVEVQKEYyLCBiLCBjLCBkLCBhLCBpblsxMl0gKyAweDhkMmE0YzhhLCAyMCk7CgogICAgTUQ1U1RFUChGMywgYSwgYiwgYywgZCwgaW5bNV0gKyAweGZmZmEzOTQyLCA0KTsKICAgIE1ENVNURVAoRjMsIGQsIGEsIGIsIGMsIGluWzhdICsgMHg4NzcxZjY4MSwgMTEpOwogICAgTUQ1U1RFUChGMywgYywgZCwgYSwgYiwgaW5bMTFdICsgMHg2ZDlkNjEyMiwgMTYpOwogICAgTUQ1U1RFUChGMywgYiwgYywgZCwgYSwgaW5bMTRdICsgMHhmZGU1MzgwYywgMjMpOwogICAgTUQ1U1RFUChGMywgYSwgYiwgYywgZCwgaW5bMV0gKyAweGE0YmVlYTQ0LCA0KTsKICAgIE1ENVNURVAoRjMsIGQsIGEsIGIsIGMsIGluWzRdICsgMHg0YmRlY2ZhOSwgMTEpOwogICAgTUQ1U1RFUChGMywgYywgZCwgYSwgYiwgaW5bN10gKyAweGY2YmI0YjYwLCAxNik7CiAgICBNRDVTVEVQKEYzLCBiLCBjLCBkLCBhLCBpblsxMF0gKyAweGJlYmZiYzcwLCAyMyk7CiAgICBNRDVTVEVQKEYzLCBhLCBiLCBjLCBkLCBpblsxM10gKyAweDI4OWI3ZWM2LCA0KTsKICAgIE1ENVNURVAoRjMsIGQsIGEsIGIsIGMsIGluWzBdICsgMHhlYWExMjdmYSwgMTEpOwogICAgTUQ1U1RFUChGMywgYywgZCwgYSwgYiwgaW5bM10gKyAweGQ0ZWYzMDg1LCAxNik7CiAgICBNRDVTVEVQKEYzLCBiLCBjLCBkLCBhLCBpbls2XSArIDB4MDQ4ODFkMDUsIDIzKTsKICAgIE1ENVNURVAoRjMsIGEsIGIsIGMsIGQsIGluWzldICsgMHhkOWQ0ZDAzOSwgNCk7CiAgICBNRDVTVEVQKEYzLCBkLCBhLCBiLCBjLCBpblsxMl0gKyAweGU2ZGI5OWU1LCAxMSk7CiAgICBNRDVTVEVQKEYzLCBjLCBkLCBhLCBiLCBpblsxNV0gKyAweDFmYTI3Y2Y4LCAxNik7CiAgICBNRDVTVEVQKEYzLCBiLCBjLCBkLCBhLCBpblsyXSArIDB4YzRhYzU2NjUsIDIzKTsKCiAgICBNRDVTVEVQKEY0LCBhLCBiLCBjLCBkLCBpblswXSArIDB4ZjQyOTIyNDQsIDYpOwogICAgTUQ1U1RFUChGNCwgZCwgYSwgYiwgYywgaW5bN10gKyAweDQzMmFmZjk3LCAxMCk7CiAgICBNRDVTVEVQKEY0LCBjLCBkLCBhLCBiLCBpblsxNF0gKyAweGFiOTQyM2E3LCAxNSk7CiAgICBNRDVTVEVQKEY0LCBiLCBjLCBkLCBhLCBpbls1XSArIDB4ZmM5M2EwMzksIDIxKTsKICAgIE1ENVNURVAoRjQsIGEsIGIsIGMsIGQsIGluWzEyXSArIDB4NjU1YjU5YzMsIDYpOwogICAgTUQ1U1RFUChGNCwgZCwgYSwgYiwgYywgaW5bM10gKyAweDhmMGNjYzkyLCAxMCk7CiAgICBNRDVTVEVQKEY0LCBjLCBkLCBhLCBiLCBpblsxMF0gKyAweGZmZWZmNDdkLCAxNSk7CiAgICBNRDVTVEVQKEY0LCBiLCBjLCBkLCBhLCBpblsxXSArIDB4ODU4NDVkZDEsIDIxKTsKICAgIE1ENVNURVAoRjQsIGEsIGIsIGMsIGQsIGluWzhdICsgMHg2ZmE4N2U0ZiwgNik7CiAgICBNRDVTVEVQKEY0LCBkLCBhLCBiLCBjLCBpblsxNV0gKyAweGZlMmNlNmUwLCAxMCk7CiAgICBNRDVTVEVQKEY0LCBjLCBkLCBhLCBiLCBpbls2XSArIDB4YTMwMTQzMTQsIDE1KTsKICAgIE1ENVNURVAoRjQsIGIsIGMsIGQsIGEsIGluWzEzXSArIDB4NGUwODExYTEsIDIxKTsKICAgIE1ENVNURVAoRjQsIGEsIGIsIGMsIGQsIGluWzRdICsgMHhmNzUzN2U4MiwgNik7CiAgICBNRDVTVEVQKEY0LCBkLCBhLCBiLCBjLCBpblsxMV0gKyAweGJkM2FmMjM1LCAxMCk7CiAgICBNRDVTVEVQKEY0LCBjLCBkLCBhLCBiLCBpblsyXSArIDB4MmFkN2QyYmIsIDE1KTsKICAgIE1ENVNURVAoRjQsIGIsIGMsIGQsIGEsIGluWzldICsgMHhlYjg2ZDM5MSwgMjEpOwoKICAgIGJ1ZlswXSArPSBhOwogICAgYnVmWzFdICs9IGI7CiAgICBidWZbMl0gKz0gYzsKICAgIGJ1ZlszXSArPSBkOwp9CgoKCgpzdHJ1Y3Qgcm5ncyB7CiAgIGNvbnN0IGNoYXIgKnBhdGg7CiAgIGludCBtaW5sZW5ndGgsIG1heGxlbmd0aDsKfSBybmdzW10gPSB7CiAgIHsgIi9kZXYvcmFuZG9tIiwgICAgICAgICAgICAgIDE2LCAgMTYgfSwgLyogMTYgYnl0ZXMgPSAxMjggYml0cyBzdWZmaWNlICovCiAgIHsgIi9wcm9jL2ludGVycnVwdHMiLCAgICAgICAgICAwLCAgIDAgfSwKICAgeyAiL3Byb2Mvc2xhYmluZm8iLCAgICAgICAgICAgIDAsICAgMCB9LAogICB7ICIvcHJvYy9zdGF0IiwgICAgICAgICAgICAgICAgMCwgICAwIH0sCiAgIHsgIi9kZXYvdXJhbmRvbSIsICAgICAgICAgICAgIDMyLCAgNjQgfSwKfTsKI2RlZmluZSBSTkdTIChzaXplb2Yocm5ncykvc2l6ZW9mKHN0cnVjdCBybmdzKSkKCmludCBWZXJib3NlID0gMDsKCi8qIFRoZSBiYXNpYyBmdW5jdGlvbiB0byBoYXNoIGEgZmlsZSAqLwpzdGF0aWMgb2ZmX3QKaGFzaF9maWxlKHN0cnVjdCBNRDVDb250ZXh0ICpjdHgsIGludCBmZCkKewogICBvZmZfdCBjb3VudCA9IDA7CiAgIHNzaXplX3QgcjsKICAgdW5zaWduZWQgY2hhciBidWZbQlVGRkVSU0laRV07CgogICB3aGlsZSAoKHIgPSByZWFkKGZkLCBidWYsIHNpemVvZihidWYpKSkgPiAwKSB7CiAgICAgIE1ENVVwZGF0ZShjdHgsIGJ1Ziwgcik7CiAgICAgIGNvdW50ICs9IHI7CiAgIH0KICAgLyogU2VwYXJhdGUgZmlsZXMgd2l0aCBhIG51bGwgYnl0ZSAqLwogICBidWZbMF0gPSAwOwogICBNRDVVcGRhdGUoY3R4LCBidWYsIDEpOwogICByZXR1cm4gY291bnQ7Cn0KCmludCBtYWluKCBpbnQgYXJnYywgY2hhciAqKmFyZ3YgKQp7CiAgIGludCAgICAgICAgICAgICAgIGk7CiAgIHN0cnVjdCBNRDVDb250ZXh0IGN0eDsKICAgdW5zaWduZWQgY2hhciAgICAgZGlnZXN0WzE2XTsKICAgdW5zaWduZWQgY2hhciAgICAgYnVmW0JVRkZFUlNJWkVdOwogICBpbnQgICAgICAgICAgICAgICBmZDsKICAgaW50ICAgICAgICAgICAgICAgYzsKICAgcGlkX3QgICAgICAgICAgICAgcGlkOwogICBjaGFyICAgICAgICAgICAgICAqZmlsZSA9IE5VTEw7CiAgIGludCAgICAgICAgICAgICAgIHI7CiAgIHN0cnVjdCB0aW1ldmFsICAgIHR2OwogICBzdHJ1Y3QgdGltZXpvbmUgICB0ejsKCiAgIHdoaWxlICgoYyA9IGdldG9wdCggYXJnYywgYXJndiwgInZmOiIgKSkgIT0gLTEpCiAgICAgIHN3aXRjaCAoYykgewogICAgICBjYXNlICd2JzogKytWZXJib3NlOyAgICAgYnJlYWs7CiAgICAgIGNhc2UgJ2YnOiBmaWxlID0gb3B0YXJnOyBicmVhazsKICAgICAgfQoKICAgTUQ1SW5pdCggJmN0eCApOwogICAKICAgZ2V0dGltZW9mZGF5KCAmdHYsICZ0eiApOwogICBNRDVVcGRhdGUoICZjdHgsICh1bnNpZ25lZCBjaGFyICopJnR2LCBzaXplb2YoIHR2ICkgKTsKICAgcGlkID0gZ2V0cHBpZCgpOwogICBNRDVVcGRhdGUoICZjdHgsICh1bnNpZ25lZCBjaGFyICopJnBpZCwgc2l6ZW9mKCBwaWQgKSk7CiAgIHBpZCA9IGdldHBpZCgpOwogICBNRDVVcGRhdGUoICZjdHgsICh1bnNpZ25lZCBjaGFyICopJnBpZCwgc2l6ZW9mKCBwaWQgKSk7CgogICBpZiAoZmlsZSkgewogICAgICBpbnQgY291bnQgPSAwOwogICAgICAKICAgICAgaWYgKGZpbGVbMF0gPT0gJy0nICYmICFmaWxlWzFdKQoJIGZkID0gZmlsZW5vKHN0ZGluKTsKICAgICAgZWxzZQoJIGZkID0gb3BlbiggZmlsZSwgT19SRE9OTFkgKTsKCiAgICAgIGlmIChmZCA8IDApIHsKCSBmcHJpbnRmKCBzdGRlcnIsICJDb3VsZCBub3Qgb3BlbiAlc1xuIiwgZmlsZSApOwogICAgICB9IGVsc2UgewogICAgICAgICBjb3VudCA9IGhhc2hfZmlsZSggJmN0eCwgZmQgKTsKCSBpZiAoVmVyYm9zZSkKCSAgICBmcHJpbnRmKCBzdGRlcnIsICJHb3QgJWQgYnl0ZXMgZnJvbSAlc1xuIiwgY291bnQsIGZpbGUgKTsKCgkgaWYgKGZpbGVbMF0gIT0gJy0nIHx8IGZpbGVbMV0pIGNsb3NlKCBmZCApOwogICAgICB9CiAgIH0KCiAgIGZvciAoaSA9IDA7IGkgPCBSTkdTOyBpKyspIHsKICAgICAgaWYgKChmZCA9IG9wZW4oIHJuZ3NbaV0ucGF0aCwgT19SRE9OTFl8T19OT05CTE9DSyApKSA+PSAwKSB7CgkgaW50IGNvdW50ID0gc2l6ZW9mKGJ1Zik7CgoJIGlmIChybmdzW2ldLm1heGxlbmd0aCAmJiBjb3VudCA+IHJuZ3NbaV0ubWF4bGVuZ3RoKQoJICAgIGNvdW50ID0gcm5nc1tpXS5tYXhsZW5ndGg7CgkgciA9IHJlYWQoIGZkLCBidWYsIGNvdW50ICk7CgkgaWYgKHIgPiAwKQoJICAgIE1ENVVwZGF0ZSggJmN0eCwgYnVmLCByICk7CgkgZWxzZQoJICAgIHIgPSAwOwoJIGNsb3NlKCBmZCApOwoJIGlmIChWZXJib3NlKQoJICAgIGZwcmludGYoIHN0ZGVyciwgIkdvdCAlZCBieXRlcyBmcm9tICVzXG4iLCByLCBybmdzW2ldLnBhdGggKTsKCSBpZiAocm5nc1tpXS5taW5sZW5ndGggJiYgciA+PSBybmdzW2ldLm1pbmxlbmd0aCkKCSAgICBicmVhazsKICAgICAgfSBlbHNlIGlmIChWZXJib3NlKQoJIGZwcmludGYoIHN0ZGVyciwgIkNvdWxkIG5vdCBvcGVuICVzXG4iLCBybmdzW2ldLnBhdGggKTsKICAgfQoKICAgTUQ1RmluYWwoIGRpZ2VzdCwgJmN0eCApOwogICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgcHJpbnRmKCAiJTAyeCIsIGRpZ2VzdFtpXSApOwogICBwdXRjaGFyICggJ1xuJyApOwogICAKICAgLyoKICAgICogVGhlIGZvbGxvd2luZyBpcyBpbXBvcnRhbnQgZm9yIGNhc2VzIGxpa2UgZGlzayBmdWxsLCBzbyBzaGVsbCBzY3JpcHRzCiAgICAqIGNhbiBib21iIG91dCBwcm9wZXJseSByYXRoZXIgdGhhbiB0aGluayB0aGV5IHN1Y2NlZWRlZC4KICAgICovCiAgIGlmIChmZmx1c2goc3Rkb3V0KSA8IDAgfHwgZmNsb3NlKHN0ZG91dCkgPCAwKQogICAgICByZXR1cm4gMTsKCiAgIHJldHVybiAwOwp9Cg==