LyoKICogICBjaGZuLmMgLS0gY2hhbmdlIHlvdXIgZmluZ2VyIGluZm9ybWF0aW9uCiAqICAgKGMpIDE5OTQgYnkgc2FsdmF0b3JlIHZhbGVudGUgPHN2YWxlbnRlQGF0aGVuYS5taXQuZWR1PgogKgogKiAgIHRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlLiAgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kCiAqICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgZ251IGdlbmVyYWwgcHVibGljIGxpY2Vuc2UuCiAqICAgdGhlcmUgaXMgbm8gd2FycmFudHkuCiAqCiAqICAgJEF1dGhvcjogYWViciAkCiAqICAgJFJldmlzaW9uOiAxLjE4ICQKICogICAkRGF0ZTogMTk5OC8wNi8xMSAyMjozMDoxMSAkCiAqCiAqIFVwZGF0ZWQgVGh1IE9jdCAxMiAwOToxOToyNiAxOTk1IGJ5IGZhaXRoQGNzLnVuYy5lZHUgd2l0aCBzZWN1cml0eQogKiBwYXRjaGVzIGZyb20gWmVmcmFtIDxBLk1haW5AZGNzLndhcndpY2suYWMudWs+CiAqCiAqIEhhY2tlZCBieSBQZXRlciBCcmVpdGVubG9obmVyLCBwZWJAbXBwbXUubXBnLmRlLAogKiB0byByZW1vdmUgdHJhaWxpbmcgZW1wdHkgZmllbGRzLiAgT2N0IDUsIDk2LgogKgogKiAgMTk5OS0wMi0yMiBBcmthZGl1c3ogTWm2a2lld2ljeiA8bWlzaWVrQHBsZC5PUkcuUEw+CiAqICAtIGFkZGVkIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0CiAqICAgIAogKgogKi8KCiNkZWZpbmUgX0JTRF9TT1VSQ0UgICAgICAgICAgIC8qIGZvciBzdHJjYXNlY21wKCkgKi8KCiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8dW5pc3RkLmg+CiNpbmNsdWRlIDxwd2QuaD4KI2luY2x1ZGUgPGVycm5vLmg+CiNpbmNsdWRlIDxjdHlwZS5oPgojaW5jbHVkZSA8Z2V0b3B0Lmg+CiNpbmNsdWRlICJteV9jcnlwdC5oIgojaW5jbHVkZSAiaXNsb2NhbC5oIgojaW5jbHVkZSAic2V0cHduYW0uaCIKI2luY2x1ZGUgInhzdHJuY3B5LmgiCiNpbmNsdWRlICJubHMuaCIKI2luY2x1ZGUgImVudi5oIgoKI2lmZGVmIEhBVkVfTElCU0VMSU5VWAojaW5jbHVkZSA8c2VsaW51eC9zZWxpbnV4Lmg+CiNpbmNsdWRlIDxzZWxpbnV4L2F2X3Blcm1pc3Npb25zLmg+CiNpbmNsdWRlICJzZWxpbnV4X3V0aWxzLmgiCiNlbmRpZgoKI2lmIGRlZmluZWQoUkVRVUlSRV9QQVNTV09SRCkgJiYgZGVmaW5lZChIQVZFX1NFQ1VSSVRZX1BBTV9NSVNDX0gpCiNpbmNsdWRlIDxzZWN1cml0eS9wYW1fYXBwbC5oPgojaW5jbHVkZSA8c2VjdXJpdHkvcGFtX21pc2MuaD4KCiNkZWZpbmUgUEFNX0ZBSUxfQ0hFQ0soX3BoLCBfcmMpIFwKICAgIGRvIHsgXAoJaWYgKChfcmMpICE9IFBBTV9TVUNDRVNTKSB7IFwKCSAgICBmcHJpbnRmKHN0ZGVyciwgIlxuJXNcbiIsIHBhbV9zdHJlcnJvcigoX3BoKSwgKF9yYykpKTsgXAoJICAgIHBhbV9lbmQoKF9waCksIChfcmMpKTsgXAoJICAgIGV4aXQoMSk7IFwKCX0gXAogICAgfSB3aGlsZSgwKQoKI2VuZGlmCgp0eXBlZGVmIHVuc2lnbmVkIGNoYXIgYm9vbGVhbjsKI2RlZmluZSBmYWxzZSAwCiNkZWZpbmUgdHJ1ZSAxCgpzdGF0aWMgY2hhciAqd2hvYW1pOwoKc3RhdGljIGNoYXIgYnVmWzEwMjRdOwoKc3RydWN0IGZpbmZvIHsKICAgIHN0cnVjdCBwYXNzd2QgKnB3OwogICAgY2hhciAqdXNlcm5hbWU7CiAgICBjaGFyICpmdWxsX25hbWU7CiAgICBjaGFyICpvZmZpY2U7CiAgICBjaGFyICpvZmZpY2VfcGhvbmU7CiAgICBjaGFyICpob21lX3Bob25lOwogICAgY2hhciAqb3RoZXI7Cn07CgpzdGF0aWMgYm9vbGVhbiBwYXJzZV9hcmd2IChpbnQgYXJnYywgY2hhciAqYXJndltdLCBzdHJ1Y3QgZmluZm8gKnBpbmZvKTsKc3RhdGljIHZvaWQgdXNhZ2UgKEZJTEUgKmZwKTsKc3RhdGljIHZvaWQgcGFyc2VfcGFzc3dkIChzdHJ1Y3QgcGFzc3dkICpwdywgc3RydWN0IGZpbmZvICpwaW5mbyk7CnN0YXRpYyB2b2lkIGFza19pbmZvIChzdHJ1Y3QgZmluZm8gKm9sZGZwLCBzdHJ1Y3QgZmluZm8gKm5ld2ZwKTsKc3RhdGljIGNoYXIgKnByb21wdCAoY2hhciAqcXVlc3Rpb24sIGNoYXIgKmRlZl92YWwpOwpzdGF0aWMgaW50IGNoZWNrX2dlY29zX3N0cmluZyAoY2hhciAqbXNnLCBjaGFyICpnZWNvcyk7CnN0YXRpYyBib29sZWFuIHNldF9jaGFuZ2VkX2RhdGEgKHN0cnVjdCBmaW5mbyAqb2xkZnAsIHN0cnVjdCBmaW5mbyAqbmV3ZnApOwpzdGF0aWMgaW50IHNhdmVfbmV3X2RhdGEgKHN0cnVjdCBmaW5mbyAqcGluZm8pOwpzdGF0aWMgdm9pZCAqeG1hbGxvYyAoaW50IGJ5dGVzKTsKCiNkZWZpbmUgbWVtemVybyhwdHIsIHNpemUpIG1lbXNldCgoY2hhciAqKSBwdHIsIDAsIHNpemUpCgovKiB3ZSBkbyBub3QgYWNjZXB0IGdlY29zIGZpZWxkIHNpemVzIGxvbmdlciB0aGFuIE1BWF9GSUVMRF9TSVpFICovCiNkZWZpbmUgTUFYX0ZJRUxEX1NJWkUJCTI1NgoKaW50IG1haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikgewogICAgY2hhciAqY3A7CiAgICB1aWRfdCB1aWQ7CiAgICBzdHJ1Y3QgZmluZm8gb2xkZiwgbmV3ZjsKICAgIGJvb2xlYW4gaW50ZXJhY3RpdmU7CiAgICBpbnQgc3RhdHVzOwoKICAgIHNhbml0aXplX2VudigpOwogICAgc2V0bG9jYWxlKExDX0FMTCwgIiIpOwkvKiBib3RoIGZvciBtZXNzYWdlcyBhbmQgZm9yIGlzY250cmwoKSBiZWxvdyAqLwogICAgYmluZHRleHRkb21haW4oUEFDS0FHRSwgTE9DQUxFRElSKTsKICAgIHRleHRkb21haW4oUEFDS0FHRSk7CgogICAgLyogd2hvYW1pIGlzIHRoZSBwcm9ncmFtIG5hbWUgZm9yIGVycm9yIG1lc3NhZ2VzICovCiAgICB3aG9hbWkgPSBhcmd2WzBdOwogICAgaWYgKCEgd2hvYW1pKSB3aG9hbWkgPSAiY2hmbiI7CiAgICBmb3IgKGNwID0gd2hvYW1pOyAqY3A7IGNwKyspCglpZiAoKmNwID09ICcvJykgd2hvYW1pID0gY3AgKyAxOwoKICAgIC8qCiAgICAgKgkib2xkZiIgY29udGFpbnMgdGhlIHVzZXJzIG9yaWdpbmFsIGZpbmdlciBpbmZvcm1hdGlvbi4KICAgICAqCSJuZXdmIiBjb250YWlucyB0aGUgY2hhbmdlZCBmaW5nZXIgaW5mb3JtYXRpb24sIGFuZCBjb250YWlucyBOVUxMCiAgICAgKgkgICAgICAgaW4gZmllbGRzIHRoYXQgaGF2ZW4ndCBiZWVuIGNoYW5nZWQuCiAgICAgKglpbiB0aGUgZW5kLCAibmV3ZiIgaXMgZm9sZGVkIGludG8gIm9sZGYiLgogICAgICoJdGhlIHJlYXNvbiB0aGUgbmV3IGZpbmdlciBpbmZvcm1hdGlvbiBpcyBub3QgcHV0IF9pbW1lZGlhdGVseV8gaW50bwogICAgICoJIm9sZGYiIGlzIHRoYXQgb24gdGhlIGNvbW1hbmQgbGluZSwgbmV3IGZpbmdlciBpbmZvcm1hdGlvbiBjYW4KICAgICAqCWJlIHNwZWNpZmllZCBiZWZvcmUgd2Uga25vdyB3aGF0IHVzZXIgdGhlIGluZm9ybWF0aW9uIGlzIGJlaW5nCiAgICAgKglzcGVjaWZpZWQgZm9yLgogICAgICovCiAgICB1aWQgPSBnZXR1aWQgKCk7CiAgICBtZW16ZXJvICgmb2xkZiwgc2l6ZW9mIChvbGRmKSk7CiAgICBtZW16ZXJvICgmbmV3Ziwgc2l6ZW9mIChuZXdmKSk7CgogICAgaW50ZXJhY3RpdmUgPSBwYXJzZV9hcmd2IChhcmdjLCBhcmd2LCAmbmV3Zik7CiAgICBpZiAoISBuZXdmLnVzZXJuYW1lKSB7CglwYXJzZV9wYXNzd2QgKGdldHB3dWlkICh1aWQpLCAmb2xkZik7CglpZiAoISBvbGRmLnVzZXJuYW1lKSB7CgkgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogeW91ICh1c2VyICVkKSBkb24ndCBleGlzdC5cbiIpLCB3aG9hbWksIHVpZCk7CgkgICAgcmV0dXJuICgtMSk7IH0KICAgIH0KICAgIGVsc2UgewoJcGFyc2VfcGFzc3dkIChnZXRwd25hbSAobmV3Zi51c2VybmFtZSksICZvbGRmKTsKCWlmICghIG9sZGYudXNlcm5hbWUpIHsKCSAgICBjcCA9IG5ld2YudXNlcm5hbWU7CgkgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogdXNlciBcIiVzXCIgZG9lcyBub3QgZXhpc3QuXG4iKSwgd2hvYW1pLCBjcCk7CgkgICAgcmV0dXJuICgtMSk7IH0KICAgIH0KCiAgICBpZiAoIShpc19sb2NhbChvbGRmLnVzZXJuYW1lKSkpIHsKICAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IGNhbiBvbmx5IGNoYW5nZSBsb2NhbCBlbnRyaWVzOyB1c2UgeXAlcyBpbnN0ZWFkLlxuIiksCiAgICAgICAgICAgd2hvYW1pLCB3aG9hbWkpOwogICAgICAgZXhpdCgxKTsKICAgIH0KCiNpZmRlZiBIQVZFX0xJQlNFTElOVVgKICAgIGlmIChpc19zZWxpbnV4X2VuYWJsZWQoKSA+IDApIHsKICAgICAgaWYodWlkID09IDApIHsKCWlmIChjaGVja0FjY2VzcyhvbGRmLnVzZXJuYW1lLFBBU1NXRF9fQ0hGTikhPTApIHsKCSAgc2VjdXJpdHlfY29udGV4dF90IHVzZXJfY29udGV4dDsKCSAgaWYgKGdldHByZXZjb24oJnVzZXJfY29udGV4dCkgPCAwKQoJICAgIHVzZXJfY29udGV4dD0oc2VjdXJpdHlfY29udGV4dF90KSBzdHJkdXAoXygiVW5rbm93biB1c2VyIGNvbnRleHQiKSk7CgkgIGZwcmludGYoc3RkZXJyLCBfKCIlczogJXMgaXMgbm90IGF1dGhvcml6ZWQgdG8gY2hhbmdlIHRoZSBmaW5nZXIgaW5mbyBvZiAlc1xuIiksCgkJICB3aG9hbWksIHVzZXJfY29udGV4dCwgb2xkZi51c2VybmFtZSk7CgkgIGZyZWVjb24odXNlcl9jb250ZXh0KTsKCSAgZXhpdCgxKTsKCX0KICAgICAgfQogICAgICBpZiAoc2V0dXBEZWZhdWx0Q29udGV4dCgiL2V0Yy9wYXNzd2QiKSAhPSAwKSB7CglmcHJpbnRmKHN0ZGVycixfKCIlczogQ2FuJ3Qgc2V0IGRlZmF1bHQgY29udGV4dCBmb3IgL2V0Yy9wYXNzd2QiKSwKCQl3aG9hbWkpOwoJZXhpdCgxKTsKICAgICAgfQogICAgfQojZW5kaWYKCiAgICAvKiBSZWFsaXR5IGNoZWNrICovCiAgICBpZiAodWlkICE9IDAgJiYgdWlkICE9IG9sZGYucHctPnB3X3VpZCkgewoJZXJybm8gPSBFQUNDRVM7CglwZXJyb3IgKHdob2FtaSk7CglyZXR1cm4gKC0xKTsKICAgIH0KCiAgICBwcmludGYgKF8oIkNoYW5naW5nIGZpbmdlciBpbmZvcm1hdGlvbiBmb3IgJXMuXG4iKSwgb2xkZi51c2VybmFtZSk7CgojaWZkZWYgUkVRVUlSRV9QQVNTV09SRAojaWZkZWYgSEFWRV9TRUNVUklUWV9QQU1fTUlTQ19ICiAgICBpZih1aWQgIT0gMCkgewoJcGFtX2hhbmRsZV90ICpwYW1oID0gTlVMTDsKCXN0cnVjdCBwYW1fY29udiBjb252ID0geyBtaXNjX2NvbnYsIE5VTEwgfTsKCWludCByZXRjb2RlOwoKCXJldGNvZGUgPSBwYW1fc3RhcnQoImNoZm4iLCBvbGRmLnVzZXJuYW1lLCAmY29udiwgJnBhbWgpOwoJaWYocmV0Y29kZSAhPSBQQU1fU1VDQ0VTUykgewoJICAgIGZwcmludGYoc3RkZXJyLCBfKCIlczogUEFNIGZhaWx1cmUsIGFib3J0aW5nOiAlc1xuIiksCgkJICAgIHdob2FtaSwgcGFtX3N0cmVycm9yKHBhbWgsIHJldGNvZGUpKTsKCSAgICBleGl0KDEpOwoJfQoKCXJldGNvZGUgPSBwYW1fYXV0aGVudGljYXRlKHBhbWgsIDApOwoJUEFNX0ZBSUxfQ0hFQ0socGFtaCwgcmV0Y29kZSk7CgoJcmV0Y29kZSA9IHBhbV9hY2N0X21nbXQocGFtaCwgMCk7CglpZiAocmV0Y29kZSA9PSBQQU1fTkVXX0FVVEhUT0tfUkVRRCkKCSAgICByZXRjb2RlID0gcGFtX2NoYXV0aHRvayhwYW1oLCBQQU1fQ0hBTkdFX0VYUElSRURfQVVUSFRPSyk7CglQQU1fRkFJTF9DSEVDSyhwYW1oLCByZXRjb2RlKTsKCglyZXRjb2RlID0gcGFtX3NldGNyZWQocGFtaCwgMCk7CglQQU1fRkFJTF9DSEVDSyhwYW1oLCByZXRjb2RlKTsKCglwYW1fZW5kKHBhbWgsIDApOwoJLyogbm8gbmVlZCB0byBlc3RhYmxpc2ggYSBzZXNzaW9uOyB0aGlzIGlzbid0IGEgc2Vzc2lvbi1vcmllbnRlZAoJICogYWN0aXZpdHkuLi4gKi8KICAgIH0KIyBlbHNlIC8qIEhBVkVfU0VDVVJJVFlfUEFNX01JU0NfSCAqLwogICAgLyogcmVxdWlyZSBwYXNzd29yZCwgdW5sZXNzIHJvb3QgKi8KICAgIGlmKHVpZCAhPSAwICYmIG9sZGYucHctPnB3X3Bhc3N3ZCAmJiBvbGRmLnB3LT5wd19wYXNzd2RbMF0pIHsKCWNoYXIgKnB3ZHN0ciA9IGdldHBhc3MoXygiUGFzc3dvcmQ6ICIpKTsKCWlmKHN0cm5jbXAob2xkZi5wdy0+cHdfcGFzc3dkLAoJCSAgIGNyeXB0KHB3ZHN0ciwgb2xkZi5wdy0+cHdfcGFzc3dkKSwgMTMpKSB7CgkgICAgcHV0cyhfKCJJbmNvcnJlY3QgcGFzc3dvcmQuIikpOwoJICAgIGV4aXQoMSk7Cgl9CiAgICB9CiMgZW5kaWYgLyogSEFWRV9TRUNVUklUWV9QQU1fTUlTQ19IICovCiNlbmRpZiAvKiBSRVFVSVJFX1BBU1NXT1JEICovCgoKICAgIGlmIChpbnRlcmFjdGl2ZSkgYXNrX2luZm8gKCZvbGRmLCAmbmV3Zik7CgogICAgaWYgKCEgc2V0X2NoYW5nZWRfZGF0YSAoJm9sZGYsICZuZXdmKSkgewoJcHJpbnRmIChfKCJGaW5nZXIgaW5mb3JtYXRpb24gbm90IGNoYW5nZWQuXG4iKSk7CglyZXR1cm4gMDsKICAgIH0KICAgIHN0YXR1cyA9IHNhdmVfbmV3X2RhdGEgKCZvbGRmKTsKICAgIHJldHVybiBzdGF0dXM7Cn0KCi8qCiAqICBwYXJzZV9hcmd2ICgpIC0tCiAqCXBhcnNlIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzLgogKglyZXR1cm5zIHRydWUgaWYgbm8gaW5mb3JtYXRpb24gYmV5b25kIHRoZSB1c2VybmFtZSB3YXMgZ2l2ZW4uCiAqLwpzdGF0aWMgYm9vbGVhbiBwYXJzZV9hcmd2IChhcmdjLCBhcmd2LCBwaW5mbykKICAgIGludCBhcmdjOwogICAgY2hhciAqYXJndltdOwogICAgc3RydWN0IGZpbmZvICpwaW5mbzsKewogICAgaW50IGluZGV4LCBjLCBzdGF0dXM7CiAgICBib29sZWFuIGluZm9fZ2l2ZW47CgogICAgc3RhdGljIHN0cnVjdCBvcHRpb24gbG9uZ19vcHRpb25zW10gPSB7Cgl7ICJmdWxsLW5hbWUiLAkgIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnZicgfSwKCXsgIm9mZmljZSIsCSAgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdvJyB9LAoJeyAib2ZmaWNlLXBob25lIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdwJyB9LAoJeyAiaG9tZS1waG9uZSIsICAgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdoJyB9LAoJeyAiaGVscCIsCSAgbm9fYXJndW1lbnQsICAgICAgIDAsICd1JyB9LAoJeyAidmVyc2lvbiIsCSAgbm9fYXJndW1lbnQsCSAgICAgMCwgJ3YnIH0sCgl7IE5VTEwsCQkgIG5vX2FyZ3VtZW50LAkgICAgIDAsICcwJyB9LAogICAgfTsKCiAgICBvcHRpbmQgPSAwOwogICAgaW5mb19naXZlbiA9IGZhbHNlOwogICAgd2hpbGUgKHRydWUpIHsKCWMgPSBnZXRvcHRfbG9uZyAoYXJnYywgYXJndiwgImY6cjpwOmg6bzp1diIsIGxvbmdfb3B0aW9ucywgJmluZGV4KTsKCWlmIChjID09IC0xKSBicmVhazsKCS8qIHZlcnNpb24/ICBvdXRwdXQgdmVyc2lvbiBhbmQgZXhpdC4gKi8KCWlmIChjID09ICd2JykgewoJICAgIHByaW50ZiAoIiVzXG4iLCBQQUNLQUdFX1NUUklORyk7CgkgICAgZXhpdCAoMCk7Cgl9CglpZiAoYyA9PSAndScpIHsKCSAgICB1c2FnZSAoc3Rkb3V0KTsKCSAgICBleGl0ICgwKTsKCX0KCS8qIGFsbCBvdGhlciBvcHRpb25zIG11c3QgaGF2ZSBhbiBhcmd1bWVudC4gKi8KCWlmICghIG9wdGFyZykgewoJICAgIHVzYWdlIChzdGRlcnIpOwoJICAgIGV4aXQgKC0xKTsKCX0KCS8qIG9rLCB3ZSB3ZXJlIGdpdmVuIGFuIGFyZ3VtZW50ICovCglpbmZvX2dpdmVuID0gdHJ1ZTsKCXN0YXR1cyA9IDA7CgoJeHN0cm5jcHkgKGJ1Ziwgd2hvYW1pLCBzaXplb2YoYnVmKS0xMjgpOyAKCXN0cmNhdCAoYnVmLCAiOiAiKTsKCgkvKiBub3cgc3RvcmUgdGhlIGFyZ3VtZW50ICovCglzd2l0Y2ggKGMpIHsKCWNhc2UgJ2YnOgoJICAgIHBpbmZvLT5mdWxsX25hbWUgPSBvcHRhcmc7CgkgICAgc3RyY2F0IChidWYsICJmdWxsIG5hbWUiKTsKCSAgICBzdGF0dXMgPSBjaGVja19nZWNvc19zdHJpbmcgKGJ1Ziwgb3B0YXJnKTsKCSAgICBicmVhazsKCWNhc2UgJ28nOgoJICAgIHBpbmZvLT5vZmZpY2UgPSBvcHRhcmc7CgkgICAgc3RyY2F0IChidWYsICJvZmZpY2UiKTsKCSAgICBzdGF0dXMgPSBjaGVja19nZWNvc19zdHJpbmcgKGJ1Ziwgb3B0YXJnKTsKCSAgICBicmVhazsKCWNhc2UgJ3AnOgoJICAgIHBpbmZvLT5vZmZpY2VfcGhvbmUgPSBvcHRhcmc7CgkgICAgc3RyY2F0IChidWYsICJvZmZpY2UgcGhvbmUiKTsKCSAgICBzdGF0dXMgPSBjaGVja19nZWNvc19zdHJpbmcgKGJ1Ziwgb3B0YXJnKTsKCSAgICBicmVhazsKCWNhc2UgJ2gnOgoJICAgIHBpbmZvLT5ob21lX3Bob25lID0gb3B0YXJnOwoJICAgIHN0cmNhdCAoYnVmLCAiaG9tZSBwaG9uZSIpOwoJICAgIHN0YXR1cyA9IGNoZWNrX2dlY29zX3N0cmluZyAoYnVmLCBvcHRhcmcpOwoJICAgIGJyZWFrOwoJZGVmYXVsdDoKCSAgICB1c2FnZSAoc3RkZXJyKTsKCSAgICBzdGF0dXMgPSAoLTEpOwoJfQoJaWYgKHN0YXR1cyA8IDApIGV4aXQgKHN0YXR1cyk7CiAgICB9CiAgICAvKiBkb25lIHBhcnNpbmcgYXJndW1lbnRzLgljaGVjayBmb3IgYSB1c2VybmFtZS4gKi8KICAgIGlmIChvcHRpbmQgPCBhcmdjKSB7CglpZiAob3B0aW5kICsgMSA8IGFyZ2MpIHsKCSAgICB1c2FnZSAoc3RkZXJyKTsKCSAgICBleGl0ICgtMSk7Cgl9CglwaW5mby0+dXNlcm5hbWUgPSBhcmd2W29wdGluZF07CiAgICB9CiAgICByZXR1cm4gKCEgaW5mb19naXZlbik7Cn0KCi8qCiAqICB1c2FnZSAoKSAtLQogKglwcmludCBvdXQgYSB1c2FnZSBtZXNzYWdlLgogKi8Kc3RhdGljIHZvaWQgdXNhZ2UgKGZwKQogICAgRklMRSAqZnA7CnsKICAgIGZwcmludGYgKGZwLCBfKCJVc2FnZTogJXMgWyAtZiBmdWxsLW5hbWUgXSBbIC1vIG9mZmljZSBdICIpLCB3aG9hbWkpOwogICAgZnByaW50ZiAoZnAsIF8oIlsgLXAgb2ZmaWNlLXBob25lIF1cbglbIC1oIGhvbWUtcGhvbmUgXSAiKSk7CiAgICBmcHJpbnRmIChmcCwgXygiWyAtLWhlbHAgXSBbIC0tdmVyc2lvbiBdXG4iKSk7Cn0KCi8qCiAqICBwYXJzZV9wYXNzd2QgKCkgLS0KICoJdGFrZSBhIHN0cnVjdCBwYXNzd29yZCBhbmQgZmlsbCBpbiB0aGUgZmllbGRzIG9mIHRoZQogKglzdHJ1Y3QgZmluZm8uCiAqLwpzdGF0aWMgdm9pZCBwYXJzZV9wYXNzd2QgKHB3LCBwaW5mbykKICAgIHN0cnVjdCBwYXNzd2QgKnB3OwogICAgc3RydWN0IGZpbmZvICpwaW5mbzsKewogICAgY2hhciAqZ2Vjb3M7CiAgICBjaGFyICpjcDsKCiAgICBpZiAocHcpIHsKCXBpbmZvLT5wdyA9IHB3OwoJcGluZm8tPnVzZXJuYW1lID0gcHctPnB3X25hbWU7CgkvKiB1c2UgcHdfZ2Vjb3MgLSB3ZSB0YWtlIGEgY29weSBzaW5jZSBQQU0gZGVzdHJveXMgdGhlIG9yaWdpbmFsICovCglnZWNvcyA9IHN0cmR1cChwdy0+cHdfZ2Vjb3MpOwoJY3AgPSAoZ2Vjb3MgPyBnZWNvcyA6ICIiKTsKCXBpbmZvLT5mdWxsX25hbWUgPSBjcDsKCWNwID0gc3RyY2hyIChjcCwgJywnKTsKCWlmIChjcCkgeyAqY3AgPSAwLCBjcCsrOyB9IGVsc2UgcmV0dXJuOwoJcGluZm8tPm9mZmljZSA9IGNwOwoJY3AgPSBzdHJjaHIgKGNwLCAnLCcpOwoJaWYgKGNwKSB7ICpjcCA9IDAsIGNwKys7IH0gZWxzZSByZXR1cm47CglwaW5mby0+b2ZmaWNlX3Bob25lID0gY3A7CgljcCA9IHN0cmNociAoY3AsICcsJyk7CglpZiAoY3ApIHsgKmNwID0gMCwgY3ArKzsgfSBlbHNlIHJldHVybjsKCXBpbmZvLT5ob21lX3Bob25lID0gY3A7CgkvKiAgZXh0cmEgZmllbGRzIGNvbnRhaW4gc2l0ZS1zcGVjaWZpYyBpbmZvcm1hdGlvbiwgYW5kCgkgKiAgY2FuIG5vdCBiZSBjaGFuZ2VkIGJ5IHRoaXMgdmVyc2lvbiBvZiBjaGZuLgkgKi8KCWNwID0gc3RyY2hyIChjcCwgJywnKTsKCWlmIChjcCkgeyAqY3AgPSAwLCBjcCsrOyB9IGVsc2UgcmV0dXJuOwoJcGluZm8tPm90aGVyID0gY3A7CiAgICB9Cn0KCi8qCiAqICBhc2tfaW5mbyAoKSAtLQogKglwcm9tcHQgdGhlIHVzZXIgZm9yIHRoZSBmaW5nZXIgaW5mb3JtYXRpb24gYW5kIHN0b3JlIGl0LgogKi8Kc3RhdGljIHZvaWQgYXNrX2luZm8gKG9sZGZwLCBuZXdmcCkKICAgIHN0cnVjdCBmaW5mbyAqb2xkZnA7CiAgICBzdHJ1Y3QgZmluZm8gKm5ld2ZwOwp7CiAgICBuZXdmcC0+ZnVsbF9uYW1lID0gcHJvbXB0IChfKCJOYW1lIiksIG9sZGZwLT5mdWxsX25hbWUpOwogICAgbmV3ZnAtPm9mZmljZSA9IHByb21wdCAoXygiT2ZmaWNlIiksIG9sZGZwLT5vZmZpY2UpOwogICAgbmV3ZnAtPm9mZmljZV9waG9uZSA9IHByb21wdCAoXygiT2ZmaWNlIFBob25lIiksIG9sZGZwLT5vZmZpY2VfcGhvbmUpOwogICAgbmV3ZnAtPmhvbWVfcGhvbmUgPSBwcm9tcHQgKF8oIkhvbWUgUGhvbmUiKSwgb2xkZnAtPmhvbWVfcGhvbmUpOwogICAgcHJpbnRmICgiXG4iKTsKfQoKLyoKICogIHByb21wdCAoKSAtLQogKglhc2sgdGhlIHVzZXIgZm9yIGEgZ2l2ZW4gZmllbGQgYW5kIGNoZWNrIHRoYXQgdGhlIHN0cmluZyBpcyBsZWdhbC4KICovCnN0YXRpYyBjaGFyICpwcm9tcHQgKHF1ZXN0aW9uLCBkZWZfdmFsKQogICAgY2hhciAqcXVlc3Rpb247CiAgICBjaGFyICpkZWZfdmFsOwp7CiAgICBzdGF0aWMgY2hhciAqYmxhbmsgPSAibm9uZSI7CiAgICBpbnQgbGVuOwogICAgY2hhciAqYW5zLCAqY3A7CiAgCiAgICB3aGlsZSAodHJ1ZSkgewoJaWYgKCEgZGVmX3ZhbCkgZGVmX3ZhbCA9ICIiOwoJcHJpbnRmKCIlcyBbJXNdOiAiLCBxdWVzdGlvbiwgZGVmX3ZhbCk7CgkqYnVmID0gMDsKCWlmIChmZ2V0cyAoYnVmLCBzaXplb2YgKGJ1ZiksIHN0ZGluKSA9PSBOVUxMKSB7CgkgICAgcHJpbnRmIChfKCJcbkFib3J0ZWQuXG4iKSk7CgkgICAgZXhpdCAoLTEpOwoJfQoJLyogcmVtb3ZlIHRoZSBuZXdsaW5lIGF0IHRoZSBlbmQgb2YgYnVmLiAqLwoJYW5zID0gYnVmOwoJd2hpbGUgKGlzc3BhY2UgKCphbnMpKSBhbnMrKzsKCWxlbiA9IHN0cmxlbiAoYW5zKTsKCXdoaWxlIChsZW4gPiAwICYmIGlzc3BhY2UgKGFuc1tsZW4tMV0pKSBsZW4tLTsKCWlmIChsZW4gPD0gMCkgcmV0dXJuIE5VTEw7CglhbnNbbGVuXSA9IDA7CglpZiAoISBzdHJjYXNlY21wIChhbnMsIGJsYW5rKSkgcmV0dXJuICIiOwoJaWYgKGNoZWNrX2dlY29zX3N0cmluZyAoTlVMTCwgYW5zKSA+PSAwKSBicmVhazsKICAgIH0KICAgIGNwID0gKGNoYXIgKikgeG1hbGxvYyAobGVuICsgMSk7CiAgICBzdHJjcHkgKGNwLCBhbnMpOwogICAgcmV0dXJuIGNwOwp9CgovKgogKiAgY2hlY2tfZ2Vjb3Nfc3RyaW5nICgpIC0tCiAqCWNoZWNrIHRoYXQgdGhlIGdpdmVuIGdlY29zIHN0cmluZyBpcyBsZWdhbC4gIGlmIGl0J3Mgbm90IGxlZ2FsLAogKglvdXRwdXQgIm1zZyIgZm9sbG93ZWQgYnkgYSBkZXNjcmlwdGlvbiBvZiB0aGUgcHJvYmxlbSwgYW5kCiAqCXJldHVybiAoLTEpLgogKi8Kc3RhdGljIGludCBjaGVja19nZWNvc19zdHJpbmcgKG1zZywgZ2Vjb3MpCiAgICBjaGFyICptc2c7CiAgICBjaGFyICpnZWNvczsKewogICAgaW50IGksIGM7CgogICAgaWYgKHN0cmxlbihnZWNvcykgPiBNQVhfRklFTERfU0laRSkgewoJaWYgKG1zZyAhPSBOVUxMKQoJICAgIHByaW50ZigiJXM6ICIsIG1zZyk7CglwcmludGYoXygiZmllbGQgaXMgdG9vIGxvbmcuXG4iKSk7CglyZXR1cm4gLTE7CiAgICB9CgogICAgZm9yIChpID0gMDsgaSA8IHN0cmxlbiAoZ2Vjb3MpOyBpKyspIHsKCWMgPSBnZWNvc1tpXTsKCWlmIChjID09ICcsJyB8fCBjID09ICc6JyB8fCBjID09ICc9JyB8fCBjID09ICciJyB8fCBjID09ICdcbicpIHsKCSAgICBpZiAobXNnKSBwcmludGYgKCIlczogIiwgbXNnKTsKCSAgICBwcmludGYgKF8oIiclYycgaXMgbm90IGFsbG93ZWQuXG4iKSwgYyk7CgkgICAgcmV0dXJuICgtMSk7Cgl9CglpZiAoaXNjbnRybCAoYykpIHsKCSAgICBpZiAobXNnKSBwcmludGYgKCIlczogIiwgbXNnKTsKCSAgICBwcmludGYgKF8oIkNvbnRyb2wgY2hhcmFjdGVycyBhcmUgbm90IGFsbG93ZWQuXG4iKSk7CgkgICAgcmV0dXJuICgtMSk7Cgl9CiAgICB9CiAgICByZXR1cm4gKDApOwp9CgovKgogKiAgc2V0X2NoYW5nZWRfZGF0YSAoKSAtLQogKglpbmNvcnBvcmF0ZSB0aGUgbmV3IGRhdGEgaW50byB0aGUgb2xkIGZpbmdlciBpbmZvLgogKi8Kc3RhdGljIGJvb2xlYW4gc2V0X2NoYW5nZWRfZGF0YSAob2xkZnAsIG5ld2ZwKQogICAgc3RydWN0IGZpbmZvICpvbGRmcDsKICAgIHN0cnVjdCBmaW5mbyAqbmV3ZnA7CnsKICAgIGJvb2xlYW4gY2hhbmdlZCA9IGZhbHNlOwoKICAgIGlmIChuZXdmcC0+ZnVsbF9uYW1lKSB7CglvbGRmcC0+ZnVsbF9uYW1lID0gbmV3ZnAtPmZ1bGxfbmFtZTsgY2hhbmdlZCA9IHRydWU7IH0KICAgIGlmIChuZXdmcC0+b2ZmaWNlKSB7CglvbGRmcC0+b2ZmaWNlID0gbmV3ZnAtPm9mZmljZTsgY2hhbmdlZCA9IHRydWU7IH0KICAgIGlmIChuZXdmcC0+b2ZmaWNlX3Bob25lKSB7CglvbGRmcC0+b2ZmaWNlX3Bob25lID0gbmV3ZnAtPm9mZmljZV9waG9uZTsgY2hhbmdlZCA9IHRydWU7IH0KICAgIGlmIChuZXdmcC0+aG9tZV9waG9uZSkgewoJb2xkZnAtPmhvbWVfcGhvbmUgPSBuZXdmcC0+aG9tZV9waG9uZTsgY2hhbmdlZCA9IHRydWU7IH0KCiAgICByZXR1cm4gY2hhbmdlZDsKfQoKLyoKICogIHNhdmVfbmV3X2RhdGEgKCkgLS0KICoJc2F2ZSB0aGUgZ2l2ZW4gZmluZ2VyIGluZm8gaW4gL2V0Yy9wYXNzd2QuCiAqCXJldHVybiB6ZXJvIG9uIHN1Y2Nlc3MuCiAqLwpzdGF0aWMgaW50IHNhdmVfbmV3X2RhdGEgKHBpbmZvKQogICAgIHN0cnVjdCBmaW5mbyAqcGluZm87CnsKICAgIGNoYXIgKmdlY29zOwogICAgaW50IGxlbjsKCiAgICAvKiBudWxsIGZpZWxkcyB3aWxsIGNvbmZ1c2UgcHJpbnRmKCkuICovCiAgICBpZiAoISBwaW5mby0+ZnVsbF9uYW1lKSBwaW5mby0+ZnVsbF9uYW1lID0gIiI7CiAgICBpZiAoISBwaW5mby0+b2ZmaWNlKSBwaW5mby0+b2ZmaWNlID0gIiI7CiAgICBpZiAoISBwaW5mby0+b2ZmaWNlX3Bob25lKSBwaW5mby0+b2ZmaWNlX3Bob25lID0gIiI7CiAgICBpZiAoISBwaW5mby0+aG9tZV9waG9uZSkgcGluZm8tPmhvbWVfcGhvbmUgPSAiIjsKICAgIGlmICghIHBpbmZvLT5vdGhlcikgcGluZm8tPm90aGVyID0gIiI7CgogICAgLyogY3JlYXRlIHRoZSBuZXcgZ2Vjb3Mgc3RyaW5nICovCiAgICBsZW4gPSAoc3RybGVuIChwaW5mby0+ZnVsbF9uYW1lKSArIHN0cmxlbiAocGluZm8tPm9mZmljZSkgKwoJICAgc3RybGVuIChwaW5mby0+b2ZmaWNlX3Bob25lKSArIHN0cmxlbiAocGluZm8tPmhvbWVfcGhvbmUpICsKCSAgIHN0cmxlbiAocGluZm8tPm90aGVyKSArIDQpOwogICAgZ2Vjb3MgPSAoY2hhciAqKSB4bWFsbG9jIChsZW4gKyAxKTsKICAgIHNwcmludGYgKGdlY29zLCAiJXMsJXMsJXMsJXMsJXMiLCBwaW5mby0+ZnVsbF9uYW1lLCBwaW5mby0+b2ZmaWNlLAoJICAgICBwaW5mby0+b2ZmaWNlX3Bob25lLCBwaW5mby0+aG9tZV9waG9uZSwgcGluZm8tPm90aGVyKTsKCiAgICAvKiByZW1vdmUgdHJhaWxpbmcgZW1wdHkgZmllbGRzIChidXQgbm90IHN1YmZpZWxkcyBvZiBwaW5mby0+b3RoZXIpICovCiAgICBpZiAoISBwaW5mby0+b3RoZXJbMF0gKSB7CiAgICAgICB3aGlsZSAobGVuID4gMCAmJiBnZWNvc1tsZW4tMV0gPT0gJywnKSBsZW4tLTsKICAgICAgIGdlY29zW2xlbl0gPSAwOwogICAgfQoKICAgIC8qIHdyaXRlIHRoZSBuZXcgc3RydWN0IHBhc3N3ZCB0byB0aGUgcGFzc3dkIGZpbGUuICovCiAgICBwaW5mby0+cHctPnB3X2dlY29zID0gZ2Vjb3M7CiAgICBpZiAoc2V0cHduYW0gKHBpbmZvLT5wdykgPCAwKSB7CglwZXJyb3IgKCJzZXRwd25hbSIpOwoJcHJpbnRmKCBfKCJGaW5nZXIgaW5mb3JtYXRpb24gKk5PVCogY2hhbmdlZC4gIFRyeSBhZ2FpbiBsYXRlci5cbiIgKSk7CglyZXR1cm4gKC0xKTsKICAgIH0KICAgIHByaW50ZiAoXygiRmluZ2VyIGluZm9ybWF0aW9uIGNoYW5nZWQuXG4iKSk7CiAgICByZXR1cm4gMDsKfQoKLyoKICogIHhtYWxsb2MgKCkgLS0gbWFsbG9jIHRoYXQgbmV2ZXIgZmFpbHMuCiAqLwpzdGF0aWMgdm9pZCAqeG1hbGxvYyAoYnl0ZXMpCiAgICBpbnQgYnl0ZXM7CnsKICAgIHZvaWQgKnZwOwoKICAgIHZwID0gbWFsbG9jIChieXRlcyk7CiAgICBpZiAoISB2cCAmJiBieXRlcyA+IDApIHsKCXBlcnJvciAoXygibWFsbG9jIGZhaWxlZCIpKTsKCWV4aXQgKC0xKTsKICAgIH0KICAgIHJldHVybiB2cDsKfQo=