LyoKICogKEMpIENvcHlyaWdodCAyMDAyCiAqIERhbmllbCBFbmdzdHL2bSwgT21pY3JvbiBDZXRpIEFCIDxkYW5pZWxAb21pY3Jvbi5zZT4uCiAqCiAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCiAqIHByb2plY3QuCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCiAqIE1BIDAyMTExLTEzMDcgVVNBCiAqLwoKLyogc3R1ZmYgc3BlY2lmaWMgZm9yIHRoZSBzYzUyMCwKICogYnV0IGlkZXBlbmRlbnQgb2YgaW1wbGVtZW50YXRpb24gKi8KCiNpbmNsdWRlIDxjb25maWcuaD4KI2luY2x1ZGUgPGNvbW1vbi5oPgojaW5jbHVkZSA8Y29uZmlnLmg+CiNpbmNsdWRlIDxwY2kuaD4KI2lmZGVmIENPTkZJR19TQzUyMF9TU0kKI2luY2x1ZGUgPGFzbS9pYy9zc2kuaD4KI2VuZGlmCiNpbmNsdWRlIDxhc20vaW8uaD4KI2luY2x1ZGUgPGFzbS9wY2kuaD4KI2luY2x1ZGUgPGFzbS9pYy9zYzUyMC5oPgoKREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CgovKgogKiB1dGlsaXR5IGZ1bmN0aW9ucyBmb3IgYm9hcmRzIGJhc2VkIG9uIHRoZSBBTUQgc2M1MjAKICoKICogdm9pZCB3cml0ZV9tbWNyX2J5dGUodTE2IG1tY3IsIHU4IGRhdGEpCiAqIHZvaWQgd3JpdGVfbW1jcl93b3JkKHUxNiBtbWNyLCB1MTYgZGF0YSkKICogdm9pZCB3cml0ZV9tbWNyX2xvbmcodTE2IG1tY3IsIHUzMiBkYXRhKQogKgogKiB1OCAgIHJlYWRfbW1jcl9ieXRlKHUxNiBtbWNyKQogKiB1MTYgIHJlYWRfbW1jcl93b3JkKHUxNiBtbWNyKQogKiB1MzIgIHJlYWRfbW1jcl9sb25nKHUxNiBtbWNyKQogKgogKiB2b2lkIGluaXRfc2M1MjAodm9pZCkKICogdW5zaWduZWQgbG9uZyBpbml0X3NjNTIwX2RyYW0odm9pZCkKICogdm9pZCBwY2lfc2M1MjBfaW5pdChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UpCiAqCiAqIHZvaWQgcmVzZXRfdGltZXIodm9pZCkKICogdWxvbmcgZ2V0X3RpbWVyKHVsb25nIGJhc2UpCiAqIHZvaWQgc2V0X3RpbWVyKHVsb25nIHQpCiAqIHZvaWQgdWRlbGF5KHVuc2lnbmVkIGxvbmcgdXNlYykKICoKICovCgpzdGF0aWMgdTMyIG1tY3JfYmFzZT0gMHhmZmZlZjAwMDsKCnZvaWQgd3JpdGVfbW1jcl9ieXRlKHUxNiBtbWNyLCB1OCBkYXRhKQp7Cgl3cml0ZWIoZGF0YSwgbW1jcittbWNyX2Jhc2UpOwp9Cgp2b2lkIHdyaXRlX21tY3Jfd29yZCh1MTYgbW1jciwgdTE2IGRhdGEpCnsKCXdyaXRldyhkYXRhLCBtbWNyK21tY3JfYmFzZSk7Cn0KCnZvaWQgd3JpdGVfbW1jcl9sb25nKHUxNiBtbWNyLCB1MzIgZGF0YSkKewoJd3JpdGVsKGRhdGEsIG1tY3IrbW1jcl9iYXNlKTsKfQoKdTggcmVhZF9tbWNyX2J5dGUodTE2IG1tY3IpCnsKCXJldHVybiByZWFkYihtbWNyK21tY3JfYmFzZSk7Cn0KCnUxNiByZWFkX21tY3Jfd29yZCh1MTYgbW1jcikKewoJcmV0dXJuIHJlYWR3KG1tY3IrbW1jcl9iYXNlKTsKfQoKdTMyIHJlYWRfbW1jcl9sb25nKHUxNiBtbWNyKQp7CglyZXR1cm4gcmVhZGwobW1jcittbWNyX2Jhc2UpOwp9CgoKdm9pZCBpbml0X3NjNTIwKHZvaWQpCnsKCS8qIFNldCB0aGUgVUFSVHhDVEwgcmVnaXN0ZXIgYXQgaXQncyBzbG93ZXIsCgkgKiBiYXVkIGNsb2NrIGdpdmluZyB1cyBhIDEuODQzMiBNSHogcmVmZXJlbmNlCgkgKi8KCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9VQVJUMUNUTCwgNyk7Cgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfVUFSVDJDVEwsIDcpOwoKCS8qIGZpcnN0IHNldCB0aGUgdGltZXIgcGluIG1hcHBpbmcgKi8KCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9DTEtTRUwsIDB4NzIpOwkvKiBubyBjbG9jayBmcmVxdWVuY3kgc2VsZWN0ZWQsIHVzZSAxLjE4OTJNSHogKi8KCgkvKiBlbmFibGUgUENJIGJ1cyBhcmJpdHJlciAqLwoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX1NZU0FSQkNUTCwweDAyKTsgIC8qIGVuYWJsZSBjb25jdXJyZW50IG1vZGUgKi8KCgl3cml0ZV9tbWNyX3dvcmQoU0M1MjBfU1lTQVJCTUVOQiwweDFmKTsgLyogZW5hYmxlIGV4dGVybmFsIGdyYW50cyAqLwoJd3JpdGVfbW1jcl93b3JkKFNDNTIwX0hCQ1RMLDB4MDQpOyAgICAgIC8qIGVuYWJsZSBwb3N0ZWQtd3JpdGVzICovCgoKCWlmIChDT05GSUdfU1lTX1NDNTIwX0hJR0hfU1BFRUQpIHsKCQl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfQ1BVQ1RMLCAweDIpOwkvKiBzZXQgaXQgdG8gMTMzIE1IeiBhbmQgd3JpdGUgYmFjayAqLwoJCWdkLT5jcHVfY2xrID0gMTMzMDAwMDAwOwoJCXByaW50ZigiIyMgQ1BVIFNwZWVkIHNldCB0byAxMzNNSHpcbiIpOwoJfSBlbHNlIHsKCQl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfQ1BVQ1RMLCAxKTsJLyogc2V0IENQVSB0byAxMDAgTUh6IGFuZCB3cml0ZSBiYWNrIGNhY2hlICovCgkJcHJpbnRmKCIjIyBDUFUgU3BlZWQgc2V0IHRvIDEwME1IelxuIik7CgkJZ2QtPmNwdV9jbGsgPSAxMDAwMDAwMDA7Cgl9CgoKCS8qIHdhaXQgYXQgbGVhc3Qgb25lIG1pbGxpc2Vjb25kICovCglhc20oIm1vdmwJJDB4MjAwMCwlJWVjeFxuIgoJICAgICJ3YWl0X2xvb3A6CXB1c2hsICUlZWN4XG4iCgkgICAgInBvcGwJJSVlY3hcbiIKCSAgICAibG9vcCB3YWl0X2xvb3BcbiI6IDogOiAiZWN4Iik7CgoJLyogdHVybiBvbiB0aGUgU0RSQU0gd3JpdGUgYnVmZmVyICovCgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfREJDVEwsIDB4MTEpOwoKCS8qIHR1cm4gb24gdGhlIGNhY2hlIGFuZCBkaXNhYmxlIHdyaXRlIHRocm91Z2ggKi8KCWFzbSgibW92bAklJWNyMCwgJSVlYXhcbiIKCSAgICAiYW5kbAkkMHg5ZmZmZmZmZiwgJSVlYXhcbiIKCSAgICAibW92bAklJWVheCwgJSVjcjBcbiIgIDogOiA6ICJlYXgiKTsKfQoKdW5zaWduZWQgbG9uZyBpbml0X3NjNTIwX2RyYW0odm9pZCkKewoJYmRfdCAqYmQgPSBnZC0+YmQ7CgoJdTMyIGRyYW1fcHJlc2VudD0wOwoJdTMyIGRyYW1fY3RybDsKI2lmZGVmIENPTkZJR19TWVNfU0RSQU1fRFJDVE1DVEwKCS8qIHRoZXNlIG1lbW9yeSBjb250cm9sIHJlZ2lzdGVycyBhcmUgc2V0IHVwIGluIHRoZSBhc3NlbWJlciBwYXJ0LAoJICogaW4gc2M1MjBfYXNtLlMsIGR1cmluZyAnbWVtX2luaXQnLiAgSWYgd2UgbXVjayB3aXRoIHRoZW0gaGVyZSwKCSAqIGFmdGVyIHdlIGFyZSBydW5uaW5nIGEgc3RhY2sgaW4gUkFNLCB3ZSBoYXZlIHRyb3VibGVzLiAgQmVzaWRlcywKCSAqIHRoZXNlIHJlZnJlc2ggYW5kIGRlbGF5IHZhbHVlcyBhcmUgYmV0dGVyID8gc2ltcGx5IHNwZWNpZmllZAoJICogb3V0cmlnaHQgaW4gdGhlIGluY2x1ZGUvY29uZmlncy97Y2ZnfSBmaWxlIHNpbmNlIHRoZSBIVyBkZXNpZ25lcgoJICogc2ltcGx5IGRpY3RhdGVzIGl0LgoJICovCiNlbHNlCglpbnQgdmFsOwoKCWludCBjYXNfcHJlY2hhcmdlX2RlbGF5ID0gQ09ORklHX1NZU19TRFJBTV9QUkVDSEFSR0VfREVMQVk7CglpbnQgcmVmcmVzaF9yYXRlICAgICAgICA9IENPTkZJR19TWVNfU0RSQU1fUkVGUkVTSF9SQVRFOwoJaW50IHJhc19jYXNfZGVsYXkgICAgICAgPSBDT05GSUdfU1lTX1NEUkFNX1JBU19DQVNfREVMQVk7CgoJLyogc2V0IFNEUkFNIHNwZWVkIGhlcmUgKi8KCglyZWZyZXNoX3JhdGUvPTc4OwoJaWYgKHJlZnJlc2hfcmF0ZTw9MSkgewoJCXZhbCA9IDA7ICAvKiA3Ljh1cyAqLwoJfSBlbHNlIGlmIChyZWZyZXNoX3JhdGU9PTIpIHsKCQl2YWwgPSAxOyAgLyogMTUuNnVzICovCgl9IGVsc2UgaWYgKHJlZnJlc2hfcmF0ZT09MyB8fCByZWZyZXNoX3JhdGU9PTQpIHsKCQl2YWwgPSAyOyAgLyogMzEuMnVzICovCgl9IGVsc2UgewoJCXZhbCA9IDM7ICAvKiA2Mi40dXMgKi8KCX0KCgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfRFJDQ1RMLCAocmVhZF9tbWNyX2J5dGUoU0M1MjBfRFJDQ1RMKSAmIDB4Y2YpIHwgKHZhbDw8NCkpOwoKCXZhbCA9IHJlYWRfbW1jcl9ieXRlKFNDNTIwX0RSQ1RNQ1RMKTsKCXZhbCAmPSAweGYwOwoKCWlmIChjYXNfcHJlY2hhcmdlX2RlbGF5PT0zKSB7CgkJdmFsIHw9IDB4MDQ7ICAgLyogM1QgKi8KCX0gZWxzZSBpZiAoY2FzX3ByZWNoYXJnZV9kZWxheT09NCkgewoJCXZhbCB8PSAweDA4OyAgIC8qIDRUICovCgl9IGVsc2UgaWYgKGNhc19wcmVjaGFyZ2VfZGVsYXk+NCkgewoJCXZhbCB8PSAweDBjOwoJfQoKCWlmIChyYXNfY2FzX2RlbGF5ID4gMykgewoJCXZhbCB8PSAyOwoJfSBlbHNlIHsKCQl2YWwgfD0gMTsKCX0KCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9EUkNUTUNUTCwgdmFsKTsKI2VuZGlmCgoJLyogV2UgcmVhZC1iYWNrIHRoZSBjb25maWd1cmF0aW9uIG9mIHRoZSBkcmFtCgkgKiBjb250cm9sbGVyIHRoYXQgdGhlIGFzc2VtYmx5IGNvZGUgd3JvdGUgKi8KCWRyYW1fY3RybCA9IHJlYWRfbW1jcl9sb25nKFNDNTIwX0RSQ0JFTkRBRFIpOwoKCWJkLT5iaV9kcmFtWzBdLnN0YXJ0ID0gMDsKCWlmIChkcmFtX2N0cmwgJiAweDgwKSB7CgkJLyogYmFuayAwIGVuYWJsZWQgKi8KCQlkcmFtX3ByZXNlbnQgPSBiZC0+YmlfZHJhbVsxXS5zdGFydCA9IChkcmFtX2N0cmwgJiAweDdmKSA8PCAyMjsKCQliZC0+YmlfZHJhbVswXS5zaXplID0gYmQtPmJpX2RyYW1bMV0uc3RhcnQ7CgoJfSBlbHNlIHsKCQliZC0+YmlfZHJhbVswXS5zaXplID0gMDsKCQliZC0+YmlfZHJhbVsxXS5zdGFydCA9IGJkLT5iaV9kcmFtWzBdLnN0YXJ0OwoJfQoKCWlmIChkcmFtX2N0cmwgJiAweDgwMDApIHsKCQkvKiBiYW5rIDEgZW5hYmxlZCAqLwoJCWRyYW1fcHJlc2VudCA9IGJkLT5iaV9kcmFtWzJdLnN0YXJ0ID0gKGRyYW1fY3RybCAmIDB4N2YwMCkgPDwgMTQ7CgkJYmQtPmJpX2RyYW1bMV0uc2l6ZSA9IGJkLT5iaV9kcmFtWzJdLnN0YXJ0IC0gIGJkLT5iaV9kcmFtWzFdLnN0YXJ0OwoJfSBlbHNlIHsKCQliZC0+YmlfZHJhbVsxXS5zaXplID0gMDsKCQliZC0+YmlfZHJhbVsyXS5zdGFydCA9IGJkLT5iaV9kcmFtWzFdLnN0YXJ0OwoJfQoKCWlmIChkcmFtX2N0cmwgJiAweDgwMDAwMCkgewoJCS8qIGJhbmsgMiBlbmFibGVkICovCgkJZHJhbV9wcmVzZW50ID0gYmQtPmJpX2RyYW1bM10uc3RhcnQgPSAoZHJhbV9jdHJsICYgMHg3ZjAwMDApIDw8IDY7CgkJYmQtPmJpX2RyYW1bMl0uc2l6ZSA9IGJkLT5iaV9kcmFtWzNdLnN0YXJ0IC0gIGJkLT5iaV9kcmFtWzJdLnN0YXJ0OwoJfSBlbHNlIHsKCQliZC0+YmlfZHJhbVsyXS5zaXplID0gMDsKCQliZC0+YmlfZHJhbVszXS5zdGFydCA9IGJkLT5iaV9kcmFtWzJdLnN0YXJ0OwoJfQoKCWlmIChkcmFtX2N0cmwgJiAweDgwMDAwMDAwKSB7CgkJLyogYmFuayAzIGVuYWJsZWQgKi8KCQlkcmFtX3ByZXNlbnQgID0gKGRyYW1fY3RybCAmIDB4N2YwMDAwMDApID4+IDI7CgkJYmQtPmJpX2RyYW1bM10uc2l6ZSA9IGRyYW1fcHJlc2VudCAtICBiZC0+YmlfZHJhbVszXS5zdGFydDsKCX0gZWxzZSB7CgkJYmQtPmJpX2RyYW1bM10uc2l6ZSA9IDA7Cgl9CgoKI2lmIDAKCXByaW50ZigiQ29uZmlndXJlZCAlZCBieXRlcyBvZiBkcmFtXG4iLCBkcmFtX3ByZXNlbnQpOwojZW5kaWYKCWdkLT5yYW1fc2l6ZSA9IGRyYW1fcHJlc2VudDsKCglyZXR1cm4gZHJhbV9wcmVzZW50Owp9CgoKI2lmZGVmIENPTkZJR19QQ0kKCgpzdGF0aWMgc3RydWN0IHsKCXU4IHByaW9yaXR5OwoJdTE2IGxldmVsX3JlZzsKCXU4IGxldmVsX2JpdDsKfSBzYzUyMF9pcnFbXSA9IHsKCXsgU0M1MjBfSVJRMCwgIFNDNTIwX01QSUNNT0RFLCAgMHgwMSB9LAoJeyBTQzUyMF9JUlExLCAgU0M1MjBfTVBJQ01PREUsICAweDAyIH0sCgl7IFNDNTIwX0lSUTIsICBTQzUyMF9TTDFQSUNNT0RFLCAweDAyIH0sCgl7IFNDNTIwX0lSUTMsICBTQzUyMF9NUElDTU9ERSwgIDB4MDggfSwKCXsgU0M1MjBfSVJRNCwgIFNDNTIwX01QSUNNT0RFLCAgMHgxMCB9LAoJeyBTQzUyMF9JUlE1LCAgU0M1MjBfTVBJQ01PREUsICAweDIwIH0sCgl7IFNDNTIwX0lSUTYsICBTQzUyMF9NUElDTU9ERSwgIDB4NDAgfSwKCXsgU0M1MjBfSVJRNywgIFNDNTIwX01QSUNNT0RFLCAgMHg4MCB9LAoKCXsgU0M1MjBfSVJROCwgIFNDNTIwX1NMMVBJQ01PREUsIDB4MDEgfSwKCXsgU0M1MjBfSVJROSwgIFNDNTIwX1NMMVBJQ01PREUsIDB4MDIgfSwKCXsgU0M1MjBfSVJRMTAsIFNDNTIwX1NMMVBJQ01PREUsIDB4MDQgfSwKCXsgU0M1MjBfSVJRMTEsIFNDNTIwX1NMMVBJQ01PREUsIDB4MDggfSwKCXsgU0M1MjBfSVJRMTIsIFNDNTIwX1NMMVBJQ01PREUsIDB4MTAgfSwKCXsgU0M1MjBfSVJRMTMsIFNDNTIwX1NMMVBJQ01PREUsIDB4MjAgfSwKCXsgU0M1MjBfSVJRMTQsIFNDNTIwX1NMMVBJQ01PREUsIDB4NDAgfSwKCXsgU0M1MjBfSVJRMTUsIFNDNTIwX1NMMVBJQ01PREUsIDB4ODAgfQp9OwoKCi8qIFRoZSBpbnRlcnJ1cHQgdXNlZCBmb3IgUENJIElOVEEtSU5URCAgKi8KaW50IHNjNTIwX3BjaV9pbnRzWzE1XSA9IHsKCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMQp9OwoKLyogdXRpbGl0eSBmdW5jdGlvbiB0byBjb25maWd1cmUgYSBwY2kgaW50ZXJydXB0ICovCmludCBwY2lfc2M1MjBfc2V0X2lycShpbnQgcGNpX3BpbiwgaW50IGlycSkKewoJaW50IGk7CgojIGlmIDEKCXByaW50Zigic2V0X2lycSgpOiBtYXAgSU5UJWMgdG8gSVJRJWRcbiIsIHBjaV9waW4gKyAnQScsIGlycSk7CiNlbmRpZgoJaWYgKGlycSA8IDAgfHwgaXJxID4gMTUpIHsKCQlyZXR1cm4gLTE7IC8qIGlsbGVnYWwgaXJxICovCgl9CgoJaWYgKHBjaV9waW4gPCAwIHx8IHBjaV9waW4gPiAxNSkgewoJCXJldHVybiAtMTsgLyogaWxsZWdhbCBwY2kgaW50IHBpbiAqLwoJfQoKCS8qIGZpcnN0IGRpc2FibGUgYW55IG5vbi1wY2kgaW50ZXJydXB0IHNvdXJjZSB0aGF0IHVzZQoJICogdGhpcyBsZXZlbCAqLwoJZm9yIChpPVNDNTIwX0dQVE1SME1BUDtpPD1TQzUyMF9HUDEwSU1BUDtpKyspIHsKCQlpZiAoaT49U0M1MjBfUENJSU5UQU1BUCYmaTw9U0M1MjBfUENJSU5URE1BUCkgewoJCQljb250aW51ZTsKCQl9CgkJaWYgKHJlYWRfbW1jcl9ieXRlKGkpID09IHNjNTIwX2lycVtpcnFdLnByaW9yaXR5KSB7CgkJCXdyaXRlX21tY3JfYnl0ZShpLCBTQzUyMF9JUlFfRElTQUJMRUQpOwoJCX0KCX0KCgkvKiBTZXQgdGhlIHRyaWdnZXIgdG8gbGV2ZWwgKi8KCXdyaXRlX21tY3JfYnl0ZShzYzUyMF9pcnFbaXJxXS5sZXZlbF9yZWcsCgkJCXJlYWRfbW1jcl9ieXRlKHNjNTIwX2lycVtpcnFdLmxldmVsX3JlZykgfCBzYzUyMF9pcnFbaXJxXS5sZXZlbF9iaXQpOwoKCglpZiAocGNpX3BpbiA8IDQpIHsKCQkvKiBQQ0kgSU5UQS1JTlREICovCgkJLyogcm91dGUgdGhlIGludGVycnVwdCAqLwoJCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9QQ0lJTlRBTUFQICsgcGNpX3Bpbiwgc2M1MjBfaXJxW2lycV0ucHJpb3JpdHkpOwoKCgl9IGVsc2UgewoJCS8qIEdQSVJRMC1HUElSUTEwIHVzZWQgZm9yIGFkZGl0aW9uYWwgUENJIElOVFMgKi8KCQl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfR1AwSU1BUCArIHBjaV9waW4gLSA0LCBzYzUyMF9pcnFbaXJxXS5wcmlvcml0eSk7CgoJCS8qIGFsc28gc2V0IHRoZSBwb2xhcml0eSBpbiB0aGlzIGNhc2UgKi8KCQl3cml0ZV9tbWNyX3dvcmQoU0M1MjBfSU5UUElOUE9MLAoJCQkJcmVhZF9tbWNyX3dvcmQoU0M1MjBfSU5UUElOUE9MKSB8ICgxIDw8IChwY2lfcGluLTQpKSk7CgoJfQoKCS8qIHJlZ2lzdGVyIHRoZSBwaW4gKi8KCXNjNTIwX3BjaV9pbnRzW3BjaV9waW5dID0gaXJxOwoKCglyZXR1cm4gMDsgLyogT0sgKi8KfQoKdm9pZCBwY2lfc2M1MjBfaW5pdChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UpCnsKCWhvc2UtPmZpcnN0X2J1c25vID0gMDsKCWhvc2UtPmxhc3RfYnVzbm8gPSAweGZmOwoKCS8qIFN5c3RlbSBtZW1vcnkgc3BhY2UgKi8KCXBjaV9zZXRfcmVnaW9uKGhvc2UtPnJlZ2lvbnMgKyAwLAoJCSAgICAgICBTQzUyMF9QQ0lfTUVNT1JZX0JVUywKCQkgICAgICAgU0M1MjBfUENJX01FTU9SWV9QSFlTLAoJCSAgICAgICBTQzUyMF9QQ0lfTUVNT1JZX1NJWkUsCgkJICAgICAgIFBDSV9SRUdJT05fTUVNIHwgUENJX1JFR0lPTl9TWVNfTUVNT1JZKTsKCgkvKiBQQ0kgbWVtb3J5IHNwYWNlICovCglwY2lfc2V0X3JlZ2lvbihob3NlLT5yZWdpb25zICsgMSwKCQkgICAgICAgU0M1MjBfUENJX01FTV9CVVMsCgkJICAgICAgIFNDNTIwX1BDSV9NRU1fUEhZUywKCQkgICAgICAgU0M1MjBfUENJX01FTV9TSVpFLAoJCSAgICAgICBQQ0lfUkVHSU9OX01FTSk7CgoJLyogSVNBL1BDSSBtZW1vcnkgc3BhY2UgKi8KCXBjaV9zZXRfcmVnaW9uKGhvc2UtPnJlZ2lvbnMgKyAyLAoJCSAgICAgICBTQzUyMF9JU0FfTUVNX0JVUywKCQkgICAgICAgU0M1MjBfSVNBX01FTV9QSFlTLAoJCSAgICAgICBTQzUyMF9JU0FfTUVNX1NJWkUsCgkJICAgICAgIFBDSV9SRUdJT05fTUVNKTsKCgkvKiBQQ0kgSS9PIHNwYWNlICovCglwY2lfc2V0X3JlZ2lvbihob3NlLT5yZWdpb25zICsgMywKCQkgICAgICAgU0M1MjBfUENJX0lPX0JVUywKCQkgICAgICAgU0M1MjBfUENJX0lPX1BIWVMsCgkJICAgICAgIFNDNTIwX1BDSV9JT19TSVpFLAoJCSAgICAgICBQQ0lfUkVHSU9OX0lPKTsKCgkvKiBJU0EvUENJIEkvTyBzcGFjZSAqLwoJcGNpX3NldF9yZWdpb24oaG9zZS0+cmVnaW9ucyArIDQsCgkJICAgICAgIFNDNTIwX0lTQV9JT19CVVMsCgkJICAgICAgIFNDNTIwX0lTQV9JT19QSFlTLAoJCSAgICAgICBTQzUyMF9JU0FfSU9fU0laRSwKCQkgICAgICAgUENJX1JFR0lPTl9JTyk7CgoJaG9zZS0+cmVnaW9uX2NvdW50ID0gNTsKCglwY2lfc2V0dXBfdHlwZTEoaG9zZSwKCQkJU0M1MjBfUkVHX0FERFIsCgkJCVNDNTIwX1JFR19EQVRBKTsKCglwY2lfcmVnaXN0ZXJfaG9zZShob3NlKTsKCglob3NlLT5sYXN0X2J1c25vID0gcGNpX2hvc2Vfc2Nhbihob3NlKTsKCgkvKiBlbmFibGUgdGFyZ2V0IG1lbW9yeSBhY2Nlc2VzIG9uIGhvc3QgYnJpZ2UgKi8KCXBjaV93cml0ZV9jb25maWdfd29yZCgwLCBQQ0lfQ09NTUFORCwKCQkJICAgICAgUENJX0NPTU1BTkRfTUVNT1JZIHwgUENJX0NPTU1BTkRfTUFTVEVSKTsKCn0KCgojZW5kaWYKCiNpZmRlZiBDT05GSUdfU1lTX1RJTUVSX1NDNTIwCgoKdm9pZCByZXNldF90aW1lcih2b2lkKQp7Cgl3cml0ZV9tbWNyX3dvcmQoU0M1MjBfR1BUTVIwQ05ULCAwKTsKCXdyaXRlX21tY3Jfd29yZChTQzUyMF9HUFRNUjBDVEwsIDB4NjAwMSk7Cgp9Cgp1bG9uZyBnZXRfdGltZXIodWxvbmcgYmFzZSkKewoJLyogZml4bWU6IDMwIG9yIDMzICovCglyZXR1cm4JcmVhZF9tbWNyX3dvcmQoU0M1MjBfR1BUTVIwQ05UKSAvIDMzOwp9Cgp2b2lkIHNldF90aW1lcih1bG9uZyB0KQp7CgkvKiBGaXhNZTogdXNlIHR3byBjYXNjYWRlIGNvdXBsZWQgdGltZXJzICovCgl3cml0ZV9tbWNyX3dvcmQoU0M1MjBfR1BUTVIwQ1RMLCAweDQwMDEpOwoJd3JpdGVfbW1jcl93b3JkKFNDNTIwX0dQVE1SMENOVCwgdCozMyk7Cgl3cml0ZV9tbWNyX3dvcmQoU0M1MjBfR1BUTVIwQ1RMLCAweDYwMDEpOwp9CgoKdm9pZCB1ZGVsYXkodW5zaWduZWQgbG9uZyB1c2VjKQp7CglpbnQgbT0wOwoJbG9uZyB1OwoKCXJlYWRfbW1jcl93b3JkKFNDNTIwX1NXVE1STUlMTEkpOwoJcmVhZF9tbWNyX3dvcmQoU0M1MjBfU1dUTVJNSUNSTyk7CgojaWYgMAoJLyogZG8gbm90IGVuYWJsZSB0aGlzIGxpbmUsIHVkZWxheSBpcyB1c2VkIGluIHRoZSBzZXJpYWwgZHJpdmVyIC0+IHJlY3Vyc2lvbiAqLwoJcHJpbnRmKCJ1ZGVsYXk6ICVsZCBtLnUgJWQuJWQgIHRtLnR1ICVkLiVkXG4iLCB1c2VjLCBtLCB1LCB0bSwgdHUpOwojZW5kaWYKCXdoaWxlICgxKSB7CgoJCW0gKz0gcmVhZF9tbWNyX3dvcmQoU0M1MjBfU1dUTVJNSUxMSSk7CgkJdSA9IHJlYWRfbW1jcl93b3JkKFNDNTIwX1NXVE1STUlDUk8pICsgKG0gKiAxMDAwKTsKCgkJaWYgKHVzZWMgPD0gdSkgewoJCQlicmVhazsKCQl9Cgl9Cn0KCiNlbmRpZgoKaW50IHNzaV9zZXRfaW50ZXJmYWNlKGludCBmcmVxLCBpbnQgbHNiX2ZpcnN0LCBpbnQgaW52X2Nsb2NrLCBpbnQgaW52X3BoYXNlKQp7Cgl1OCB0ZW1wPTA7CgoJaWYgKGZyZXEgPj0gODE5MikgewoJCXRlbXAgfD0gQ1RMX0NMS19TRUxfNDsKCX0gZWxzZSBpZiAoZnJlcSA+PSA0MDk2KSB7CgkJdGVtcCB8PSBDVExfQ0xLX1NFTF84OwoJfSBlbHNlIGlmIChmcmVxID49IDIwNDgpIHsKCQl0ZW1wIHw9IENUTF9DTEtfU0VMXzE2OwoJfSBlbHNlIGlmIChmcmVxID49IDEwMjQpIHsKCQl0ZW1wIHw9IENUTF9DTEtfU0VMXzMyOwoJfSBlbHNlIGlmIChmcmVxID49IDUxMikgewoJCXRlbXAgfD0gQ1RMX0NMS19TRUxfNjQ7Cgl9IGVsc2UgaWYgKGZyZXEgPj0gMjU2KSB7CgkJdGVtcCB8PSBDVExfQ0xLX1NFTF8xMjg7Cgl9IGVsc2UgaWYgKGZyZXEgPj0gMTI4KSB7CgkJdGVtcCB8PSBDVExfQ0xLX1NFTF8yNTY7Cgl9IGVsc2UgewoJCXRlbXAgfD0gQ1RMX0NMS19TRUxfNTEyOwoJfQoKCWlmICghbHNiX2ZpcnN0KSB7CgkJdGVtcCB8PSBNU0JGX0VOQjsKCX0KCglpZiAoaW52X2Nsb2NrKSB7CgkJdGVtcCB8PSBDTEtfSU5WX0VOQjsKCX0KCglpZiAoaW52X3BoYXNlKSB7CgkJdGVtcCB8PSBQSFNfSU5WX0VOQjsKCX0KCgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfU1NJQ1RMLCB0ZW1wKTsKCglyZXR1cm4gMDsKfQoKdTggc3NpX3R4cnhfYnl0ZSh1OCBkYXRhKQp7Cgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfU1NJWE1JVCwgZGF0YSk7Cgl3aGlsZSAoKHJlYWRfbW1jcl9ieXRlKFNDNTIwX1NTSVNUQSkpICYgU1NJU1RBX0JTWSk7Cgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfU1NJQ01ELCBTU0lDTURfQ01EX1NFTF9YTUlUUkNWKTsKCXdoaWxlICgocmVhZF9tbWNyX2J5dGUoU0M1MjBfU1NJU1RBKSkgJiBTU0lTVEFfQlNZKTsKCXJldHVybiByZWFkX21tY3JfYnl0ZShTQzUyMF9TU0lSQ1YpOwp9CgoKdm9pZCBzc2lfdHhfYnl0ZSh1OCBkYXRhKQp7Cgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfU1NJWE1JVCwgZGF0YSk7Cgl3aGlsZSAoKHJlYWRfbW1jcl9ieXRlKFNDNTIwX1NTSVNUQSkpICYgU1NJU1RBX0JTWSk7Cgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfU1NJQ01ELCBTU0lDTURfQ01EX1NFTF9YTUlUKTsKfQoKdTggc3NpX3J4X2J5dGUodm9pZCkKewoJd2hpbGUgKChyZWFkX21tY3JfYnl0ZShTQzUyMF9TU0lTVEEpKSAmIFNTSVNUQV9CU1kpOwoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX1NTSUNNRCwgU1NJQ01EX0NNRF9TRUxfUkNWKTsKCXdoaWxlICgocmVhZF9tbWNyX2J5dGUoU0M1MjBfU1NJU1RBKSkgJiBTU0lTVEFfQlNZKTsKCXJldHVybiByZWFkX21tY3JfYnl0ZShTQzUyMF9TU0lSQ1YpOwp9CgojaWZkZWYgQ09ORklHX1NZU19SRVNFVF9TQzUyMAp2b2lkIHJlc2V0X2NwdSh1bG9uZyBhZGRyKQp7CglwcmludGYoIlJlc2V0dGluZyB1c2luZyBTQzUyMCBNTUNSXG4iKTsKCS8qIFdyaXRlIGEgJzEnIHRvIHRoZSBTWVNfUlNUIG9mIHRoZSBSRVNDRkcgTU1DUiAqLwoJd3JpdGVfbW1jcl93b3JkKFNDNTIwX1JFU0NGRywgMHgwMDAxKTsKCgkvKiBOT1RSRUFDSEVEICovCn0KI2VuZGlmCg==