LyoKICogKEMpIENvcHlyaWdodCAyMDAyCiAqIERhbmllbCBFbmdzdHL2bSwgT21pY3JvbiBDZXRpIEFCIDxkYW5pZWxAb21pY3Jvbi5zZT4uCiAqCiAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCiAqIHByb2plY3QuCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCiAqIE1BIDAyMTExLTEzMDcgVVNBCiAqLwoKLyogc3R1ZmYgc3BlY2lmaWMgZm9yIHRoZSBzYzUyMCwKICogYnV0IGlkZXBlbmRlbnQgb2YgaW1wbGVtZW50YXRpb24gKi8KCiNpbmNsdWRlIDxjb21tb24uaD4KI2luY2x1ZGUgPGFzbS9pby5oPgojaW5jbHVkZSA8YXNtL2ljL3NjNTIwLmg+CgpERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKCi8qCiAqIHV0aWxpdHkgZnVuY3Rpb25zIGZvciBib2FyZHMgYmFzZWQgb24gdGhlIEFNRCBzYzUyMAogKgogKiB2b2lkIGluaXRfc2M1MjAodm9pZCkKICogdW5zaWduZWQgbG9uZyBpbml0X3NjNTIwX2RyYW0odm9pZCkKICovCgp2b2xhdGlsZSBzYzUyMF9tbWNyX3QgKnNjNTIwX21tY3IgPSAoc2M1MjBfbW1jcl90ICopMHhmZmZlZjAwMDsKCnZvaWQgaW5pdF9zYzUyMCh2b2lkKQp7CgkvKiBTZXQgdGhlIFVBUlR4Q1RMIHJlZ2lzdGVyIGF0IGl0J3Mgc2xvd2VyLAoJICogYmF1ZCBjbG9jayBnaXZpbmcgdXMgYSAxLjg0MzIgTUh6IHJlZmVyZW5jZQoJICovCgl3cml0ZWIoMHgwNywgJnNjNTIwX21tY3ItPnVhcnQxY3RsKTsKCXdyaXRlYigweDA3LCAmc2M1MjBfbW1jci0+dWFydDJjdGwpOwoKCS8qIGZpcnN0IHNldCB0aGUgdGltZXIgcGluIG1hcHBpbmcgKi8KCXdyaXRlYigweDcyLCAmc2M1MjBfbW1jci0+Y2xrc2VsKTsJLyogbm8gY2xvY2sgZnJlcXVlbmN5IHNlbGVjdGVkLCB1c2UgMS4xODkyTUh6ICovCgoJLyogZW5hYmxlIFBDSSBidXMgYXJiaXRyZXIgKi8KCXdyaXRlYigweDAyLCAmc2M1MjBfbW1jci0+c3lzYXJiY3RsKTsJLyogZW5hYmxlIGNvbmN1cnJlbnQgbW9kZSAqLwoKCXdyaXRlYigweDFmLCAmc2M1MjBfbW1jci0+c3lzYXJibWVuYik7CS8qIGVuYWJsZSBleHRlcm5hbCBncmFudHMgKi8KCXdyaXRlYigweDA0LCAmc2M1MjBfbW1jci0+aGJjdGwpOwkvKiBlbmFibGUgcG9zdGVkLXdyaXRlcyAqLwoKCWlmIChDT05GSUdfU1lTX1NDNTIwX0hJR0hfU1BFRUQpIHsKCQl3cml0ZWIoMHgwMiwgJnNjNTIwX21tY3ItPmNwdWN0bCk7CS8qIHNldCBpdCB0byAxMzMgTUh6IGFuZCB3cml0ZSBiYWNrICovCgkJZ2QtPmNwdV9jbGsgPSAxMzMwMDAwMDA7CgkJcHJpbnRmKCIjIyBDUFUgU3BlZWQgc2V0IHRvIDEzM01IelxuIik7Cgl9IGVsc2UgewoJCXdyaXRlYigweDAxLCAmc2M1MjBfbW1jci0+Y3B1Y3RsKTsJLyogc2V0IGl0IHRvIDEwMCBNSHogYW5kIHdyaXRlIGJhY2sgKi8KCQlwcmludGYoIiMjIENQVSBTcGVlZCBzZXQgdG8gMTAwTUh6XG4iKTsKCQlnZC0+Y3B1X2NsayA9IDEwMDAwMDAwMDsKCX0KCgoJLyogd2FpdCBhdCBsZWFzdCBvbmUgbWlsbGlzZWNvbmQgKi8KCWFzbSgibW92bAkkMHgyMDAwLCUlZWN4XG4iCgkgICAgIjA6CQlwdXNobCAlJWVjeFxuIgoJICAgICJwb3BsCSUlZWN4XG4iCgkgICAgImxvb3AgMGJcbiI6IDogOiAiZWN4Iik7CgoJLyogdHVybiBvbiB0aGUgU0RSQU0gd3JpdGUgYnVmZmVyICovCgl3cml0ZWIoMHgxMSwgJnNjNTIwX21tY3ItPmRiY3RsKTsKCgkvKiB0dXJuIG9uIHRoZSBjYWNoZSBhbmQgZGlzYWJsZSB3cml0ZSB0aHJvdWdoICovCglhc20oIm1vdmwJJSVjcjAsICUlZWF4XG4iCgkgICAgImFuZGwJJDB4OWZmZmZmZmYsICUlZWF4XG4iCgkgICAgIm1vdmwJJSVlYXgsICUlY3IwXG4iICA6IDogOiAiZWF4Iik7Cn0KCnVuc2lnbmVkIGxvbmcgaW5pdF9zYzUyMF9kcmFtKHZvaWQpCnsKCWJkX3QgKmJkID0gZ2QtPmJkOwoKCXUzMiBkcmFtX3ByZXNlbnQ9MDsKCXUzMiBkcmFtX2N0cmw7CgojaWZkZWYgQ09ORklHX1NZU19TRFJBTV9EUkNUTUNUTAoJLyogdGhlc2UgbWVtb3J5IGNvbnRyb2wgcmVnaXN0ZXJzIGFyZSBzZXQgdXAgaW4gdGhlIGFzc2VtYmVyIHBhcnQsCgkgKiBpbiBzYzUyMF9hc20uUywgZHVyaW5nICdtZW1faW5pdCcuICBJZiB3ZSBtdWNrIHdpdGggdGhlbSBoZXJlLAoJICogYWZ0ZXIgd2UgYXJlIHJ1bm5pbmcgYSBzdGFjayBpbiBSQU0sIHdlIGhhdmUgdHJvdWJsZXMuICBCZXNpZGVzLAoJICogdGhlc2UgcmVmcmVzaCBhbmQgZGVsYXkgdmFsdWVzIGFyZSBiZXR0ZXIgPyBzaW1wbHkgc3BlY2lmaWVkCgkgKiBvdXRyaWdodCBpbiB0aGUgaW5jbHVkZS9jb25maWdzL3tjZmd9IGZpbGUgc2luY2UgdGhlIEhXIGRlc2lnbmVyCgkgKiBzaW1wbHkgZGljdGF0ZXMgaXQuCgkgKi8KI2Vsc2UKCXU4IHRtcDsKCXU4IHZhbDsKCglpbnQgY2FzX3ByZWNoYXJnZV9kZWxheSA9IENPTkZJR19TWVNfU0RSQU1fUFJFQ0hBUkdFX0RFTEFZOwoJaW50IHJlZnJlc2hfcmF0ZSAgICAgICAgPSBDT05GSUdfU1lTX1NEUkFNX1JFRlJFU0hfUkFURTsKCWludCByYXNfY2FzX2RlbGF5ICAgICAgID0gQ09ORklHX1NZU19TRFJBTV9SQVNfQ0FTX0RFTEFZOwoKCS8qIHNldCBTRFJBTSBzcGVlZCBoZXJlICovCgoJcmVmcmVzaF9yYXRlLz03ODsKCWlmIChyZWZyZXNoX3JhdGU8PTEpIHsKCQl2YWwgPSAwOyAgLyogNy44dXMgKi8KCX0gZWxzZSBpZiAocmVmcmVzaF9yYXRlPT0yKSB7CgkJdmFsID0gMTsgIC8qIDE1LjZ1cyAqLwoJfSBlbHNlIGlmIChyZWZyZXNoX3JhdGU9PTMgfHwgcmVmcmVzaF9yYXRlPT00KSB7CgkJdmFsID0gMjsgIC8qIDMxLjJ1cyAqLwoJfSBlbHNlIHsKCQl2YWwgPSAzOyAgLyogNjIuNHVzICovCgl9CgoJdG1wID0gKHJlYWRiKCZzYzUyMF9tbWNyLT5kcmNjdGwpICYgMHhjZikgfCAodmFsPDw0KTsKCXdyaXRlYih0bXAsICZzYzUyMF9tbWNyLT5kcmNjdGwpOwoKCXZhbCA9IHJlYWRiKCZzYzUyMF9tbWNyLT5kcmN0bWN0bCkgJiAweGYwOwoKCWlmIChjYXNfcHJlY2hhcmdlX2RlbGF5PT0zKSB7CgkJdmFsIHw9IDB4MDQ7ICAgLyogM1QgKi8KCX0gZWxzZSBpZiAoY2FzX3ByZWNoYXJnZV9kZWxheT09NCkgewoJCXZhbCB8PSAweDA4OyAgIC8qIDRUICovCgl9IGVsc2UgaWYgKGNhc19wcmVjaGFyZ2VfZGVsYXk+NCkgewoJCXZhbCB8PSAweDBjOwoJfQoKCWlmIChyYXNfY2FzX2RlbGF5ID4gMykgewoJCXZhbCB8PSAyOwoJfSBlbHNlIHsKCQl2YWwgfD0gMTsKCX0KCXdyaXRlYih2YWwsICZjNTIwX21tY3ItPmRyY3RtY3RsKTsKI2VuZGlmCgoJLyogV2UgcmVhZC1iYWNrIHRoZSBjb25maWd1cmF0aW9uIG9mIHRoZSBkcmFtCgkgKiBjb250cm9sbGVyIHRoYXQgdGhlIGFzc2VtYmx5IGNvZGUgd3JvdGUgKi8KCWRyYW1fY3RybCA9IHJlYWRsKCZzYzUyMF9tbWNyLT5kcmNiZW5kYWRyKTsKCgliZC0+YmlfZHJhbVswXS5zdGFydCA9IDA7CglpZiAoZHJhbV9jdHJsICYgMHg4MCkgewoJCS8qIGJhbmsgMCBlbmFibGVkICovCgkJZHJhbV9wcmVzZW50ID0gYmQtPmJpX2RyYW1bMV0uc3RhcnQgPSAoZHJhbV9jdHJsICYgMHg3ZikgPDwgMjI7CgkJYmQtPmJpX2RyYW1bMF0uc2l6ZSA9IGJkLT5iaV9kcmFtWzFdLnN0YXJ0OwoKCX0gZWxzZSB7CgkJYmQtPmJpX2RyYW1bMF0uc2l6ZSA9IDA7CgkJYmQtPmJpX2RyYW1bMV0uc3RhcnQgPSBiZC0+YmlfZHJhbVswXS5zdGFydDsKCX0KCglpZiAoZHJhbV9jdHJsICYgMHg4MDAwKSB7CgkJLyogYmFuayAxIGVuYWJsZWQgKi8KCQlkcmFtX3ByZXNlbnQgPSBiZC0+YmlfZHJhbVsyXS5zdGFydCA9IChkcmFtX2N0cmwgJiAweDdmMDApIDw8IDE0OwoJCWJkLT5iaV9kcmFtWzFdLnNpemUgPSBiZC0+YmlfZHJhbVsyXS5zdGFydCAtICBiZC0+YmlfZHJhbVsxXS5zdGFydDsKCX0gZWxzZSB7CgkJYmQtPmJpX2RyYW1bMV0uc2l6ZSA9IDA7CgkJYmQtPmJpX2RyYW1bMl0uc3RhcnQgPSBiZC0+YmlfZHJhbVsxXS5zdGFydDsKCX0KCglpZiAoZHJhbV9jdHJsICYgMHg4MDAwMDApIHsKCQkvKiBiYW5rIDIgZW5hYmxlZCAqLwoJCWRyYW1fcHJlc2VudCA9IGJkLT5iaV9kcmFtWzNdLnN0YXJ0ID0gKGRyYW1fY3RybCAmIDB4N2YwMDAwKSA8PCA2OwoJCWJkLT5iaV9kcmFtWzJdLnNpemUgPSBiZC0+YmlfZHJhbVszXS5zdGFydCAtICBiZC0+YmlfZHJhbVsyXS5zdGFydDsKCX0gZWxzZSB7CgkJYmQtPmJpX2RyYW1bMl0uc2l6ZSA9IDA7CgkJYmQtPmJpX2RyYW1bM10uc3RhcnQgPSBiZC0+YmlfZHJhbVsyXS5zdGFydDsKCX0KCglpZiAoZHJhbV9jdHJsICYgMHg4MDAwMDAwMCkgewoJCS8qIGJhbmsgMyBlbmFibGVkICovCgkJZHJhbV9wcmVzZW50ICA9IChkcmFtX2N0cmwgJiAweDdmMDAwMDAwKSA+PiAyOwoJCWJkLT5iaV9kcmFtWzNdLnNpemUgPSBkcmFtX3ByZXNlbnQgLSAgYmQtPmJpX2RyYW1bM10uc3RhcnQ7Cgl9IGVsc2UgewoJCWJkLT5iaV9kcmFtWzNdLnNpemUgPSAwOwoJfQoKCiNpZiAwCglwcmludGYoIkNvbmZpZ3VyZWQgJWQgYnl0ZXMgb2YgZHJhbVxuIiwgZHJhbV9wcmVzZW50KTsKI2VuZGlmCglnZC0+cmFtX3NpemUgPSBkcmFtX3ByZXNlbnQ7CgoJcmV0dXJuIGRyYW1fcHJlc2VudDsKfQoKI2lmZGVmIENPTkZJR19TWVNfU0M1MjBfUkVTRVQKdm9pZCByZXNldF9jcHUodWxvbmcgYWRkcikKewoJcHJpbnRmKCJSZXNldHRpbmcgdXNpbmcgU0M1MjAgTU1DUlxuIik7CgkvKiBXcml0ZSBhICcxJyB0byB0aGUgU1lTX1JTVCBvZiB0aGUgUkVTQ0ZHIE1NQ1IgKi8KCXdyaXRlYigweDAxLCAmc2M1MjBfbW1jci0+cmVzY2ZnKTsKCgkvKiBOT1RSRUFDSEVEICovCn0KI2VuZGlmCg==