LyogbWVtLmMgLS0tIG1lbW9yeSBmb3IgTTMyQyBzaW11bGF0b3IuCgpDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDcsIDIwMDggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCkNvbnRyaWJ1dGVkIGJ5IFJlZCBIYXQsIEluYy4KClRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgc2ltdWxhdG9ycy4KClRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Cml0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CnRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCihhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgpUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQpHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgoKWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwoKCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPGN0eXBlLmg+CiNpbmNsdWRlIDxzeXMvdGltZS5oPgojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNpbmNsdWRlIDx1bmlzdGQuaD4KI2luY2x1ZGUgPHN5cy9zZWxlY3QuaD4KI2luY2x1ZGUgPHRlcm1pb3MuaD4KCiNpbmNsdWRlICJtZW0uaCIKI2luY2x1ZGUgImNwdS5oIgojaW5jbHVkZSAic3lzY2FsbHMuaCIKI2luY2x1ZGUgIm1pc2MuaCIKI2lmZGVmIFRJTUVSX0EKI2luY2x1ZGUgImludC5oIgojaW5jbHVkZSAidGltZXJfYS5oIgojZW5kaWYKCiNkZWZpbmUgTDFfQklUUyAgKDEwKQojZGVmaW5lIEwyX0JJVFMgICgxMCkKI2RlZmluZSBPRkZfQklUUyAoMTIpCgojZGVmaW5lIEwxX0xFTiAgKDEgPDwgTDFfQklUUykKI2RlZmluZSBMMl9MRU4gICgxIDw8IEwyX0JJVFMpCiNkZWZpbmUgT0ZGX0xFTiAoMSA8PCBPRkZfQklUUykKCnN0YXRpYyB1bnNpZ25lZCBjaGFyICoqcHRbTDFfTEVOXTsKCmludCBtMzJjX2NvbnNvbGVfaWZkID0gMDsKaW50IG0zMmNfY29uc29sZV9vZmQgPSAxOwppbnQgbTMyY191c2VfcmF3X2NvbnNvbGUgPSAwOwoKI2lmZGVmIFRJTUVSX0EKVGltZXJfQSB0aW1lcl9hOwojZW5kaWYKCi8qIFsgZ2V0PTAvcHV0PTEgXVsgYnl0ZSBzaXplIF0gKi8Kc3RhdGljIHVuc2lnbmVkIGludCBtZW1fY291bnRlcnNbMl1bNV07CgojZGVmaW5lIENPVU5UKGlzcHV0LGJ5dGVzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogIGlmICh2ZXJib3NlICYmIGVuYWJsZV9jb3VudGluZykgbWVtX2NvdW50ZXJzW2lzcHV0XVtieXRlc10rKwoKdm9pZAppbml0X21lbSAodm9pZCkKewogIGludCBpLCBqOwoKICBmb3IgKGkgPSAwOyBpIDwgTDFfTEVOOyBpKyspCiAgICBpZiAocHRbaV0pCiAgICAgIHsKCWZvciAoaiA9IDA7IGogPCBMMl9MRU47IGorKykKCSAgaWYgKHB0W2ldW2pdKQoJICAgIGZyZWUgKHB0W2ldW2pdKTsKCWZyZWUgKHB0W2ldKTsKICAgICAgfQogIG1lbXNldCAocHQsIDAsIHNpemVvZiAocHQpKTsKICBtZW1zZXQgKG1lbV9jb3VudGVycywgMCwgc2l6ZW9mIChtZW1fY291bnRlcnMpKTsKfQoKc3RhdGljIHVuc2lnbmVkIGNoYXIgKgptZW1fcHRyIChhZGRyZXNzKQp7CiAgc3RhdGljIGludCByZWN1cnNpbmcgPSAwOwogIGludCBwdDEgPSAoYWRkcmVzcyA+PiAoTDJfQklUUyArIE9GRl9CSVRTKSkgJiAoKDEgPDwgTDFfQklUUykgLSAxKTsKICBpbnQgcHQyID0gKGFkZHJlc3MgPj4gT0ZGX0JJVFMpICYgKCgxIDw8IEwyX0JJVFMpIC0gMSk7CiAgaW50IHB0byA9IGFkZHJlc3MgJiAoKDEgPDwgT0ZGX0JJVFMpIC0gMSk7CgogIGlmIChhZGRyZXNzID09IDAgJiYgIXJlY3Vyc2luZykKICAgIHsKICAgICAgcmVjdXJzaW5nID0gMTsKICAgICAgcHV0X3JlZyAocGMsIG0zMmNfb3Bjb2RlX3BjKTsKICAgICAgcHJpbnRmICgiTlVMTCBwb2ludGVyIGRlcmVmZXJlbmNlIGF0IHBjPTB4JXhcbiIsIGdldF9yZWcgKHBjKSk7CiAgICAgIHN0ZXBfcmVzdWx0ID0gTTMyQ19NQUtFX0hJVF9CUkVBSyAoKTsKI2lmIDAKICAgICAgLyogVGhpcyBjb2RlIGNhbiBiZSByZS1lbmFibGVkIHRvIGhlbHAgZGlhZ25vc2UgTlVMTCBwb2ludGVyCiAgICAgICAgIGJ1Z3MgdGhhdCBhcmVuJ3QgZGVidWdnYWJsZSBpbiBHREIuICAqLwogICAgICBtMzJjX2R1bXBfYWxsX3JlZ2lzdGVycyAoKTsKICAgICAgZXhpdCAoMSk7CiNlbmRpZgogICAgfQoKICBpZiAocHRbcHQxXSA9PSAwKQogICAgcHRbcHQxXSA9ICh1bnNpZ25lZCBjaGFyICoqKSBjYWxsb2MgKEwyX0xFTiwgc2l6ZW9mIChjaGFyICoqKSk7CiAgaWYgKHB0W3B0MV1bcHQyXSA9PSAwKQogICAgewogICAgICBwdFtwdDFdW3B0Ml0gPSAodW5zaWduZWQgY2hhciAqKSBtYWxsb2MgKE9GRl9MRU4pOwogICAgICBtZW1zZXQgKHB0W3B0MV1bcHQyXSwgMCwgT0ZGX0xFTik7CiAgICB9CgogIHJldHVybiBwdFtwdDFdW3B0Ml0gKyBwdG87Cn0KCnN0YXRpYyB2b2lkCnVzZWQgKGludCByc3RhcnQsIGludCBpLCBpbnQgaikKewogIGludCByZW5kID0gaSA8PCAoTDJfQklUUyArIE9GRl9CSVRTKTsKICByZW5kICs9IGogPDwgT0ZGX0JJVFM7CiAgaWYgKHJzdGFydCA9PSAweGUwMDAwICYmIHJlbmQgPT0gMHhlMTAwMCkKICAgIHJldHVybjsKICBwcmludGYgKCJtZW06ICAgJTA4eCAtICUwOHggKCVkayBieXRlcylcbiIsIHJzdGFydCwgcmVuZCAtIDEsCgkgIChyZW5kIC0gcnN0YXJ0KSAvIDEwMjQpOwp9CgpzdGF0aWMgY2hhciAqCm1jcyAoaW50IGlzcHV0LCBpbnQgYnl0ZXMpCnsKICByZXR1cm4gY29tbWEgKG1lbV9jb3VudGVyc1tpc3B1dF1bYnl0ZXNdKTsKfQoKdm9pZAptZW1fdXNhZ2Vfc3RhdHMgKCkKewogIGludCBpLCBqOwogIGludCByc3RhcnQgPSAwOwogIGludCBwZW5kaW5nID0gMDsKCiAgZm9yIChpID0gMDsgaSA8IEwxX0xFTjsgaSsrKQogICAgaWYgKHB0W2ldKQogICAgICB7Cglmb3IgKGogPSAwOyBqIDwgTDJfTEVOOyBqKyspCgkgIGlmIChwdFtpXVtqXSkKCSAgICB7CgkgICAgICBpZiAoIXBlbmRpbmcpCgkJewoJCSAgcGVuZGluZyA9IDE7CgkJICByc3RhcnQgPSAoaSA8PCAoTDJfQklUUyArIE9GRl9CSVRTKSkgKyAoaiA8PCBPRkZfQklUUyk7CgkJfQoJICAgIH0KCSAgZWxzZSBpZiAocGVuZGluZykKCSAgICB7CgkgICAgICBwZW5kaW5nID0gMDsKCSAgICAgIHVzZWQgKHJzdGFydCwgaSwgaik7CgkgICAgfQogICAgICB9CiAgICBlbHNlCiAgICAgIHsKCWlmIChwZW5kaW5nKQoJICB7CgkgICAgcGVuZGluZyA9IDA7CgkgICAgdXNlZCAocnN0YXJ0LCBpLCAwKTsKCSAgfQogICAgICB9CiAgLyogICAgICAgbWVtIGZvbzogMTIzNDU2Nzg5MDEyIDEyMzQ1Njc4OTAxMiAxMjM0NTY3ODkwMTIgMTIzNDU2Nzg5MDEyCiAgICAgICAgICAgIDEyMzQ1Njc4OTAxMiAqLwogIHByaW50ZiAoIiAgICAgICAgICAgICAgICAgYnl0ZSAgICAgICAgc2hvcnQgICAgICBwb2ludGVyICAgICAgICAgbG9uZyIKCSAgIiAgICAgICAgZmV0Y2hcbiIpOwogIHByaW50ZiAoIm1lbSBnZXQ6ICUxMnMgJTEycyAlMTJzICUxMnMgJTEyc1xuIiwgbWNzICgwLCAxKSwgbWNzICgwLCAyKSwKCSAgbWNzICgwLCAzKSwgbWNzICgwLCA0KSwgbWNzICgwLCAwKSk7CiAgcHJpbnRmICgibWVtIHB1dDogJTEycyAlMTJzICUxMnMgJTEyc1xuIiwgbWNzICgxLCAxKSwgbWNzICgxLCAyKSwKCSAgbWNzICgxLCAzKSwgbWNzICgxLCA0KSk7Cn0KCnN0YXRpYyBpbnQgdHByID0gMDsKc3RhdGljIHZvaWQKcyAoaW50IGFkZHJlc3MsIGNoYXIgKmRpcikKewogIGlmICh0cHIgPT0gMCkKICAgIHByaW50ZiAoIk1FTVslMCp4XSAlcyIsIG1lbWJ1c19tYXNrID09IDB4ZmZmZmYgPyA1IDogNiwgYWRkcmVzcywgZGlyKTsKICB0cHIrKzsKfQoKI2RlZmluZSBTKGQpIGlmICh0cmFjZSkgcyhhZGRyZXNzLCBkKQpzdGF0aWMgdm9pZAplICgpCnsKICBpZiAoIXRyYWNlKQogICAgcmV0dXJuOwogIHRwci0tOwogIGlmICh0cHIgPT0gMCkKICAgIHByaW50ZiAoIlxuIik7Cn0KCiNkZWZpbmUgRSgpIGlmICh0cmFjZSkgZSgpCgpleHRlcm4gaW50IG0zMmNfZGlzYXNzZW1ibGU7Cgp2b2lkCm1lbV9wdXRfYnl0ZSAoaW50IGFkZHJlc3MsIHVuc2lnbmVkIGNoYXIgdmFsdWUpCnsKICB1bnNpZ25lZCBjaGFyICptOwogIGFkZHJlc3MgJj0gbWVtYnVzX21hc2s7CiAgbSA9IG1lbV9wdHIgKGFkZHJlc3MpOwogIGlmICh0cmFjZSkKICAgIHByaW50ZiAoIiAlMDJ4IiwgdmFsdWUpOwogICptID0gdmFsdWU7CiAgc3dpdGNoIChhZGRyZXNzKQogICAgewogICAgY2FzZSAweDAwZTE6CiAgICAgIHsKCXN0YXRpYyBpbnQgb2xkX2xlZCA9IC0xOwoJc3RhdGljIGNoYXIgKmxlZF9vbltdID0KCSAgeyAiXDAzM1szMW0gTyAiLCAiXDAzM1szMm0gTyAiLCAiXDAzM1szNG0gTyAiIH07CglzdGF0aWMgY2hhciAqbGVkX29mZltdID0geyAiXDAzM1swbSC3ICIsICJcMDMzWzBtILcgIiwgIlwwMzNbMG0gtyAiIH07CglpbnQgaTsKCWlmIChvbGRfbGVkICE9IHZhbHVlKQoJICB7CgkgICAgZnB1dHMgKCIgICIsIHN0ZG91dCk7CgkgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykKCSAgICAgIGlmICh2YWx1ZSAmICgxIDw8IGkpKQoJCWZwdXRzIChsZWRfb2ZmW2ldLCBzdGRvdXQpOwoJICAgICAgZWxzZQoJCWZwdXRzIChsZWRfb25baV0sIHN0ZG91dCk7CgkgICAgZnB1dHMgKCJcMDMzWzBtXHIiLCBzdGRvdXQpOwoJICAgIGZmbHVzaCAoc3Rkb3V0KTsKCSAgICBvbGRfbGVkID0gdmFsdWU7CgkgIH0KICAgICAgfQogICAgICBicmVhazsKI2lmZGVmIFRJTUVSX0EKICAgICAgLyogTTMyQyBUaW1lciBBICovCiAgICBjYXNlIDB4MzQ2OgkJLyogVEEwbG93ICovCiAgICAgIHRpbWVyX2EuY291bnQgPSAodGltZXJfYS5jb3VudCAmIDB4ZmYwMCkgfCB2YWx1ZTsKICAgICAgdGltZXJfYS5yZWxvYWQgPSB0aW1lcl9hLmNvdW50OwogICAgICBicmVhazsKICAgIGNhc2UgMHgzNDc6CQkvKiBUQTBoaWdoICovCiAgICAgIHRpbWVyX2EuY291bnQgPSAodGltZXJfYS5jb3VudCAmIDB4MDBmZikgfCAodmFsdWUgPDwgOCk7CiAgICAgIHRpbWVyX2EucmVsb2FkID0gdGltZXJfYS5jb3VudDsKICAgICAgYnJlYWs7CiAgICBjYXNlIDB4MzQwOgkJLyogVEFCU1IgKi8KICAgICAgdGltZXJfYS5ic3IgPSB2YWx1ZTsKICAgICAgYnJlYWs7CiAgICBjYXNlIDB4MzU2OgkJLyogVEEwTVIgKi8KICAgICAgdGltZXJfYS5tb2RlID0gdmFsdWU7CiAgICAgIGJyZWFrOwogICAgY2FzZSAweDM1ZjoJCS8qIFRDU1BSICovCiAgICAgIHRpbWVyX2EudGNzcHIgPSB2YWx1ZTsKICAgICAgYnJlYWs7CiAgICBjYXNlIDB4MDA2YzoJCS8qIFRBMElDICovCiAgICAgIHRpbWVyX2EuaWMgPSB2YWx1ZTsKICAgICAgYnJlYWs7CgogICAgICAvKiBSOEMgVGltZXIgUkEgKi8KICAgIGNhc2UgMHgxMDA6CQkvKiBUUkFDUiAqLwogICAgICB0aW1lcl9hLmJzciA9IHZhbHVlOwogICAgICBicmVhazsKICAgIGNhc2UgMHgxMDI6CQkvKiBUUkFNUiAqLwogICAgICB0aW1lcl9hLm1vZGUgPSB2YWx1ZTsKICAgICAgYnJlYWs7CiAgICBjYXNlIDB4MTA0OgkJLyogVFJBICovCiAgICAgIHRpbWVyX2EuY291bnQgPSB2YWx1ZTsKICAgICAgdGltZXJfYS5yZWxvYWQgPSB2YWx1ZTsKICAgICAgYnJlYWs7CiAgICBjYXNlIDB4MTAzOgkJLyogVFJBUFJFICovCiAgICAgIHRpbWVyX2EudGNzcHIgPSB2YWx1ZTsKICAgICAgYnJlYWs7CiAgICBjYXNlIDB4MDA1NjoJCS8qIFRBMElDICovCiAgICAgIHRpbWVyX2EuaWMgPSB2YWx1ZTsKICAgICAgYnJlYWs7CiNlbmRpZgoKICAgIGNhc2UgMHgyZWE6CQkvKiBtMzJjIHVhcnQxdHggKi8KICAgIGNhc2UgMHgzYWE6CQkvKiBtMTZjIHVhcnQxdHggKi8KICAgICAgewoJc3RhdGljIGludCBwZW5kaW5nX2V4aXQgPSAwOwoJaWYgKHZhbHVlID09IDApCgkgIHsKCSAgICBpZiAocGVuZGluZ19leGl0KQoJICAgICAgewoJCXN0ZXBfcmVzdWx0ID0gTTMyQ19NQUtFX0VYSVRFRCAodmFsdWUpOwoJCXJldHVybjsKCSAgICAgIH0KCSAgICBwZW5kaW5nX2V4aXQgPSAxOwoJICB9CgllbHNlCgkgIHsKCSAgICB3cml0ZSAobTMyY19jb25zb2xlX29mZCwgJnZhbHVlLCAxKTsKCSAgfQogICAgICB9CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgMHg0MDA6CiAgICAgIG0zMmNfc3lzY2FsbCAodmFsdWUpOwogICAgICBicmVhazsKCiAgICBjYXNlIDB4NDAxOgogICAgICBwdXRjaGFyICh2YWx1ZSk7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgMHg0MDI6CiAgICAgIHByaW50ZiAoIlNpbVRyYWNlOiAlMDZseCAlMDJ4XG4iLCByZWdzLnJfcGMsIHZhbHVlKTsKICAgICAgYnJlYWs7CgogICAgY2FzZSAweDQwMzoKICAgICAgcHJpbnRmICgiU2ltVHJhcDogJTA2bHggJTAyeFxuIiwgcmVncy5yX3BjLCB2YWx1ZSk7CiAgICAgIGFib3J0ICgpOwogICAgfQp9Cgp2b2lkCm1lbV9wdXRfcWkgKGludCBhZGRyZXNzLCB1bnNpZ25lZCBjaGFyIHZhbHVlKQp7CiAgUyAoIjw9Iik7CiAgbWVtX3B1dF9ieXRlIChhZGRyZXNzLCB2YWx1ZSAmIDB4ZmYpOwogIEUgKCk7CiAgQ09VTlQgKDEsIDEpOwp9Cgp2b2lkCm1lbV9wdXRfaGkgKGludCBhZGRyZXNzLCB1bnNpZ25lZCBzaG9ydCB2YWx1ZSkKewogIGlmIChhZGRyZXNzID09IDB4NDAyKQogICAgewogICAgICBwcmludGYgKCJTaW1UcmFjZTogJTA2bHggJTA0eFxuIiwgcmVncy5yX3BjLCB2YWx1ZSk7CiAgICAgIHJldHVybjsKICAgIH0KICBTICgiPD0iKTsKICBtZW1fcHV0X2J5dGUgKGFkZHJlc3MsIHZhbHVlICYgMHhmZik7CiAgbWVtX3B1dF9ieXRlIChhZGRyZXNzICsgMSwgdmFsdWUgPj4gOCk7CiAgRSAoKTsKICBDT1VOVCAoMSwgMik7Cn0KCnZvaWQKbWVtX3B1dF9wc2kgKGludCBhZGRyZXNzLCB1bnNpZ25lZCBsb25nIHZhbHVlKQp7CiAgUyAoIjw9Iik7CiAgbWVtX3B1dF9ieXRlIChhZGRyZXNzLCB2YWx1ZSAmIDB4ZmYpOwogIG1lbV9wdXRfYnl0ZSAoYWRkcmVzcyArIDEsICh2YWx1ZSA+PiA4KSAmIDB4ZmYpOwogIG1lbV9wdXRfYnl0ZSAoYWRkcmVzcyArIDIsIHZhbHVlID4+IDE2KTsKICBFICgpOwogIENPVU5UICgxLCAzKTsKfQoKdm9pZAptZW1fcHV0X3NpIChpbnQgYWRkcmVzcywgdW5zaWduZWQgbG9uZyB2YWx1ZSkKewogIFMgKCI8PSIpOwogIG1lbV9wdXRfYnl0ZSAoYWRkcmVzcywgdmFsdWUgJiAweGZmKTsKICBtZW1fcHV0X2J5dGUgKGFkZHJlc3MgKyAxLCAodmFsdWUgPj4gOCkgJiAweGZmKTsKICBtZW1fcHV0X2J5dGUgKGFkZHJlc3MgKyAyLCAodmFsdWUgPj4gMTYpICYgMHhmZik7CiAgbWVtX3B1dF9ieXRlIChhZGRyZXNzICsgMywgKHZhbHVlID4+IDI0KSAmIDB4ZmYpOwogIEUgKCk7CiAgQ09VTlQgKDEsIDQpOwp9Cgp2b2lkCm1lbV9wdXRfYmxrIChpbnQgYWRkcmVzcywgdm9pZCAqYnVmcHRyLCBpbnQgbmJ5dGVzKQp7CiAgUyAoIjw9Iik7CiAgaWYgKGVuYWJsZV9jb3VudGluZykKICAgIG1lbV9jb3VudGVyc1sxXVsxXSArPSBuYnl0ZXM7CiAgd2hpbGUgKG5ieXRlcy0tKQogICAgbWVtX3B1dF9ieXRlIChhZGRyZXNzKyssICoodW5zaWduZWQgY2hhciAqKSBidWZwdHIrKyk7CiAgRSAoKTsKfQoKdW5zaWduZWQgY2hhcgptZW1fZ2V0X3BjICgpCnsKICB1bnNpZ25lZCBjaGFyICptID0gbWVtX3B0ciAocmVncy5yX3BjICYgbWVtYnVzX21hc2spOwogIENPVU5UICgwLCAwKTsKICByZXR1cm4gKm07Cn0KCnN0YXRpYyBpbnQgY29uc29sZV9yYXcgPSAwOwpzdGF0aWMgc3RydWN0IHRlcm1pb3Mgb2F0dHI7CgpzdGF0aWMgaW50CnN0ZGluX3JlYWR5ICgpCnsKICBmZF9zZXQgaWZkOwogIGludCBuOwogIHN0cnVjdCB0aW1ldmFsIHQ7CgogIHQudHZfc2VjID0gMDsKICB0LnR2X3VzZWMgPSAwOwogIEZEX1pFUk8gKCZpZmQpOwogIEZEX1NFVCAobTMyY19jb25zb2xlX2lmZCwgJmlmZCk7CiAgbiA9IHNlbGVjdCAoMSwgJmlmZCwgMCwgMCwgJnQpOwogIHJldHVybiBuID4gMDsKfQoKdm9pZAptMzJjX3NpbV9yZXN0b3JlX2NvbnNvbGUgKCkKewogIGlmIChjb25zb2xlX3JhdykKICAgIHRjc2V0YXR0ciAobTMyY19jb25zb2xlX2lmZCwgVENTQU5PVywgJm9hdHRyKTsKICBjb25zb2xlX3JhdyA9IDA7Cn0KCnN0YXRpYyB1bnNpZ25lZCBjaGFyCm1lbV9nZXRfYnl0ZSAoaW50IGFkZHJlc3MpCnsKICB1bnNpZ25lZCBjaGFyICptOwogIGFkZHJlc3MgJj0gbWVtYnVzX21hc2s7CiAgbSA9IG1lbV9wdHIgKGFkZHJlc3MpOwogIHN3aXRjaCAoYWRkcmVzcykKICAgIHsKICAgIGNhc2UgMHgyZWQ6CQkvKiBtMzJjIHVhcnQxYzEgKi8KICAgIGNhc2UgMHgzYWQ6CQkvKiBtMTZjIHVhcnQxYzEgKi8KCiAgICAgIGlmICghY29uc29sZV9yYXcgJiYgbTMyY191c2VfcmF3X2NvbnNvbGUpCgl7CgkgIHN0cnVjdCB0ZXJtaW9zIGF0dHI7CgkgIHRjZ2V0YXR0ciAobTMyY19jb25zb2xlX2lmZCwgJmF0dHIpOwoJICB0Y2dldGF0dHIgKG0zMmNfY29uc29sZV9pZmQsICZvYXR0cik7CgkgIC8qIFdlIHdhbnQgZWFjaCBrZXkgdG8gYmUgc2VudCBhcyB0aGUgdXNlciBwcmVzc2VzIHRoZW0uICAqLwoJICBhdHRyLmNfbGZsYWcgJj0gfihJQ0FOT04gfCBFQ0hPIHwgRUNIT0UpOwoJICB0Y3NldGF0dHIgKG0zMmNfY29uc29sZV9pZmQsIFRDU0FOT1csICZhdHRyKTsKCSAgY29uc29sZV9yYXcgPSAxOwoJICBhdGV4aXQgKG0zMmNfc2ltX3Jlc3RvcmVfY29uc29sZSk7Cgl9CgogICAgICBpZiAoc3RkaW5fcmVhZHkgKCkpCglyZXR1cm4gMHgwMjsJCS8qIHR4IGVtcHR5IGFuZCByeCBmdWxsICovCiAgICAgIGVsc2UKCXJldHVybiAweDBhOwkJLyogdHJhbnNtaXR0ZXIgZW1wdHkgKi8KCiAgICBjYXNlIDB4MmVlOgkJLyogbTMyYyB1YXJ0MSByeCAqLwogICAgICB7CgljaGFyIGM7CglyZWFkIChtMzJjX2NvbnNvbGVfaWZkLCAmYywgMSk7CglpZiAobTMyY19jb25zb2xlX2lmZCA9PSAwICYmIGMgPT0gMykJLyogQ3RybC1DICovCgkgIHsKCSAgICBwcmludGYgKCJDdHJsLUMhXG4iKTsKCSAgICBleGl0ICgwKTsKCSAgfQoKCWlmIChtMzJjX2NvbnNvbGVfaWZkICE9IDEpCgkgIHsKCSAgICBpZiAoaXNncmFwaCAoYykpCgkgICAgICBwcmludGYgKCJcMDMzWzMxbSVjXDAzM1swbSIsIGMpOwoJICAgIGVsc2UKCSAgICAgIHByaW50ZiAoIlwwMzNbMzFtJTAyeFwwMzNbMG0iLCBjKTsKCSAgfQoJcmV0dXJuIGM7CiAgICAgIH0KCiNpZmRlZiBUSU1FUl9BCiAgICBjYXNlIDB4MzQ2OgkJLyogVEEwbG93ICovCiAgICAgIHJldHVybiB0aW1lcl9hLmNvdW50ICYgMHhmZjsKICAgIGNhc2UgMHgzNDc6CQkvKiBUQTBoaWdoICovCiAgICAgIHJldHVybiAodGltZXJfYS5jb3VudCA+PiA4KSAmIDB4ZmY7CiAgICBjYXNlIDB4MTA0OgkJLyogVFJBICovCiAgICAgIHJldHVybiB0aW1lcl9hLmNvdW50OwojZW5kaWYKCiAgICB9CgogIFMgKCI9PiIpOwogIGlmICh0cmFjZSkKICAgIHByaW50ZiAoIiAlMDJ4IiwgKm0pOwogIEUgKCk7CiAgcmV0dXJuICptOwp9Cgp1bnNpZ25lZCBjaGFyCm1lbV9nZXRfcWkgKGludCBhZGRyZXNzKQp7CiAgdW5zaWduZWQgY2hhciBydjsKICBTICgiPT4iKTsKICBydiA9IG1lbV9nZXRfYnl0ZSAoYWRkcmVzcyk7CiAgQ09VTlQgKDAsIDEpOwogIEUgKCk7CiAgcmV0dXJuIHJ2Owp9Cgp1bnNpZ25lZCBzaG9ydAptZW1fZ2V0X2hpIChpbnQgYWRkcmVzcykKewogIHVuc2lnbmVkIHNob3J0IHJ2OwogIFMgKCI9PiIpOwogIHJ2ID0gbWVtX2dldF9ieXRlIChhZGRyZXNzKTsKICBydiB8PSBtZW1fZ2V0X2J5dGUgKGFkZHJlc3MgKyAxKSAqIDI1NjsKICBDT1VOVCAoMCwgMik7CiAgRSAoKTsKICByZXR1cm4gcnY7Cn0KCnVuc2lnbmVkIGxvbmcKbWVtX2dldF9wc2kgKGludCBhZGRyZXNzKQp7CiAgdW5zaWduZWQgbG9uZyBydjsKICBTICgiPT4iKTsKICBydiA9IG1lbV9nZXRfYnl0ZSAoYWRkcmVzcyk7CiAgcnYgfD0gbWVtX2dldF9ieXRlIChhZGRyZXNzICsgMSkgKiAyNTY7CiAgcnYgfD0gbWVtX2dldF9ieXRlIChhZGRyZXNzICsgMikgKiA2NTUzNjsKICBDT1VOVCAoMCwgMyk7CiAgRSAoKTsKICByZXR1cm4gcnY7Cn0KCnVuc2lnbmVkIGxvbmcKbWVtX2dldF9zaSAoaW50IGFkZHJlc3MpCnsKICB1bnNpZ25lZCBsb25nIHJ2OwogIFMgKCI9PiIpOwogIHJ2ID0gbWVtX2dldF9ieXRlIChhZGRyZXNzKTsKICBydiB8PSBtZW1fZ2V0X2J5dGUgKGFkZHJlc3MgKyAxKSA8PCA4OwogIHJ2IHw9IG1lbV9nZXRfYnl0ZSAoYWRkcmVzcyArIDIpIDw8IDE2OwogIHJ2IHw9IG1lbV9nZXRfYnl0ZSAoYWRkcmVzcyArIDMpIDw8IDI0OwogIENPVU5UICgwLCA0KTsKICBFICgpOwogIHJldHVybiBydjsKfQoKdm9pZAptZW1fZ2V0X2JsayAoaW50IGFkZHJlc3MsIHZvaWQgKmJ1ZnB0ciwgaW50IG5ieXRlcykKewogIFMgKCI9PiIpOwogIGlmIChlbmFibGVfY291bnRpbmcpCiAgICBtZW1fY291bnRlcnNbMF1bMV0gKz0gbmJ5dGVzOwogIHdoaWxlIChuYnl0ZXMtLSkKICAgICooY2hhciAqKSBidWZwdHIrKyA9IG1lbV9nZXRfYnl0ZSAoYWRkcmVzcysrKTsKICBFICgpOwp9CgppbnQKc2lnbl9leHQgKGludCB2LCBpbnQgYml0cykKewogIGlmIChiaXRzIDwgMzIpCiAgICB7CiAgICAgIHYgJj0gKDEgPDwgYml0cykgLSAxOwogICAgICBpZiAodiAmICgxIDw8IChiaXRzIC0gMSkpKQoJdiAtPSAoMSA8PCBiaXRzKTsKICAgIH0KICByZXR1cm4gdjsKfQoKI2lmIFRJTUVSX0EKdm9pZAp1cGRhdGVfdGltZXJfYSAoKQp7CiAgaWYgKHRpbWVyX2EuYnNyICYgMSkKICAgIHsKICAgICAgdGltZXJfYS5wcmVzY2FsZS0tOwogICAgICBpZiAodGltZXJfYS5wcmVzY2FsZSA8IDApCgl7CgkgIGlmIChBMjQpCgkgICAgewoJICAgICAgc3dpdGNoICh0aW1lcl9hLm1vZGUgJiAweGMwKQoJCXsKCQljYXNlIDB4MDA6CgkJICB0aW1lcl9hLnByZXNjYWxlID0gMDsKCQkgIGJyZWFrOwoJCWNhc2UgMHg0MDoKCQkgIHRpbWVyX2EucHJlc2NhbGUgPSA4OwoJCSAgYnJlYWs7CgkJY2FzZSAweDgwOgoJCSAgdGltZXJfYS5wcmVzY2FsZSA9IHRpbWVyX2EudGNzcHIgJiAweDBmOwoJCSAgYnJlYWs7CgkJY2FzZSAweGMwOgoJCSAgdGltZXJfYS5wcmVzY2FsZSA9IDMyOwoJCSAgYnJlYWs7CgkJfQoJICAgIH0KCSAgZWxzZQoJICAgIHsKCSAgICAgIHRpbWVyX2EucHJlc2NhbGUgPSB0aW1lcl9hLnRjc3ByOwoJICAgIH0KCSAgdGltZXJfYS5jb3VudC0tOwoJICBpZiAodGltZXJfYS5jb3VudCA8IDApCgkgICAgewoJICAgICAgdGltZXJfYS5jb3VudCA9IHRpbWVyX2EucmVsb2FkOwoJICAgICAgaWYgKHRpbWVyX2EuaWMgJiA3KQoJCXsKCQkgIGlmIChBMjQpCgkJICAgIG1lbV9wdXRfcWkgKDB4NmMsIHRpbWVyX2EuaWMgfCAweDA4KTsKCQkgIGVsc2UKCQkgICAgbWVtX3B1dF9xaSAoMHg1NiwgdGltZXJfYS5pYyB8IDB4MDgpOwoJCX0KCSAgICB9Cgl9CiAgICB9CgogIGlmIChyZWdzLnJfZmxhZ3MgJiBGTEFHQklUX0kJLyogaW50ZXJydXB0cyBlbmFibGVkICovCiAgICAgICYmIHRpbWVyX2EuaWMgJiAweDA4CS8qIHRpbWVyIEEgaW50ZXJydXB0IHRyaWdnZXJlZCAqLwogICAgICAmJiAodGltZXJfYS5pYyAmIDB4MDcpID4gKChyZWdzLnJfZmxhZ3MgPj4gMTIpICYgMHgwNykpCiAgICB7CiAgICAgIGlmIChBMjQpCgl0cmlnZ2VyX3BlcmlwaGVyYWxfaW50ZXJydXB0ICgxMiwgMHgwNmMpOwogICAgICBlbHNlCgl0cmlnZ2VyX3BlcmlwaGVyYWxfaW50ZXJydXB0ICgyMiwgMHgwNTYpOwogICAgfQp9CiNlbmRpZgo=