LyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKICogaTJjLXBhcnBvcnQuYyBJMkMgYnVzIG92ZXIgcGFyYWxsZWwgcG9ydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKICAgQ29weXJpZ2h0IChDKSAyMDAzLTIwMDQgSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+CiAgIAogICBCYXNlZCBvbiBvbGRlciBpMmMtdmVsbGVtYW4uYyBkcml2ZXIKICAgQ29weXJpZ2h0IChDKSAxOTk1LTIwMDAgU2ltb24gRy4gVm9nbAogICBXaXRoIHNvbWUgY2hhbmdlcyBmcm9tOgogICBGcm9kbyBMb29pamFhcmQgPGZyb2RvbEBkZHMubmw+CiAgIEt59nN0aSBN5Gxra2kgPGttYWxra2lAY2MuaHV0LmZpPgogICAKICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KCiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCgogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgojaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgojaW5jbHVkZSA8bGludXgvaW5pdC5oPgojaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiNpbmNsdWRlIDxsaW51eC9pMmMuaD4KI2luY2x1ZGUgPGxpbnV4L2kyYy1hbGdvLWJpdC5oPgojaW5jbHVkZSA8YXNtL2lvLmg+CiNpbmNsdWRlICJpMmMtcGFycG9ydC5oIgoKI2RlZmluZSBERUZBVUxUX0JBU0UgMHgzNzgKCnN0YXRpYyB1MTYgYmFzZTsKbW9kdWxlX3BhcmFtKGJhc2UsIHVzaG9ydCwgMCk7Ck1PRFVMRV9QQVJNX0RFU0MoYmFzZSwgIkJhc2UgSS9PIGFkZHJlc3MiKTsKCi8qIC0tLS0tIExvdy1sZXZlbCBwYXJhbGxlbCBwb3J0IGFjY2VzcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKc3RhdGljIGlubGluZSB2b2lkIHBvcnRfd3JpdGUodW5zaWduZWQgY2hhciBwLCB1bnNpZ25lZCBjaGFyIGQpCnsKCW91dGIoZCwgYmFzZStwKTsKfQoKc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyIHBvcnRfcmVhZCh1bnNpZ25lZCBjaGFyIHApCnsKCXJldHVybiBpbmIoYmFzZStwKTsKfQoKLyogLS0tLS0gVW5pZmllZCBsaW5lIG9wZXJhdGlvbiBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgpzdGF0aWMgaW5saW5lIHZvaWQgbGluZV9zZXQoaW50IHN0YXRlLCBjb25zdCBzdHJ1Y3QgbGluZW9wICpvcCkKewoJdTggb2xkdmFsID0gcG9ydF9yZWFkKG9wLT5wb3J0KTsKCgkvKiBUb3VjaCBvbmx5IHRoZSBiaXQocykgbmVlZGVkICovCglpZiAoKG9wLT5pbnZlcnRlZCAmJiAhc3RhdGUpIHx8ICghb3AtPmludmVydGVkICYmIHN0YXRlKSkKCQlwb3J0X3dyaXRlKG9wLT5wb3J0LCBvbGR2YWwgfCBvcC0+dmFsKTsKCWVsc2UKCQlwb3J0X3dyaXRlKG9wLT5wb3J0LCBvbGR2YWwgJiB+b3AtPnZhbCk7Cn0KCnN0YXRpYyBpbmxpbmUgaW50IGxpbmVfZ2V0KGNvbnN0IHN0cnVjdCBsaW5lb3AgKm9wKQp7Cgl1OCBvbGR2YWwgPSBwb3J0X3JlYWQob3AtPnBvcnQpOwoKCXJldHVybiAoKG9wLT5pbnZlcnRlZCAmJiAob2xkdmFsICYgb3AtPnZhbCkgIT0gb3AtPnZhbCkKCSAgICB8fCAoIW9wLT5pbnZlcnRlZCAmJiAob2xkdmFsICYgb3AtPnZhbCkgPT0gb3AtPnZhbCkpOwp9CgovKiAtLS0tLSBJMkMgYWxnb3JpdGhtIGNhbGwtYmFjayBmdW5jdGlvbnMgYW5kIHN0cnVjdHVyZXMgLS0tLS0tLS0tLS0tLS0tLS0gKi8KCnN0YXRpYyB2b2lkIHBhcnBvcnRfc2V0c2NsKHZvaWQgKmRhdGEsIGludCBzdGF0ZSkKewoJbGluZV9zZXQoc3RhdGUsICZhZGFwdGVyX3Bhcm1bdHlwZV0uc2V0c2NsKTsKfQoKc3RhdGljIHZvaWQgcGFycG9ydF9zZXRzZGEodm9pZCAqZGF0YSwgaW50IHN0YXRlKQp7CglsaW5lX3NldChzdGF0ZSwgJmFkYXB0ZXJfcGFybVt0eXBlXS5zZXRzZGEpOwp9CgpzdGF0aWMgaW50IHBhcnBvcnRfZ2V0c2NsKHZvaWQgKmRhdGEpCnsKCXJldHVybiBsaW5lX2dldCgmYWRhcHRlcl9wYXJtW3R5cGVdLmdldHNjbCk7Cn0KCnN0YXRpYyBpbnQgcGFycG9ydF9nZXRzZGEodm9pZCAqZGF0YSkKewoJcmV0dXJuIGxpbmVfZ2V0KCZhZGFwdGVyX3Bhcm1bdHlwZV0uZ2V0c2RhKTsKfQoKLyogRW5jYXBzdWxhdGUgdGhlIGZ1bmN0aW9ucyBhYm92ZSBpbiB0aGUgY29ycmVjdCBzdHJ1Y3R1cmUKICAgTm90ZSB0aGF0IGdldHNjbCB3aWxsIGJlIHNldCB0byBOVUxMIGJ5IHRoZSBhdHRhY2hpbmcgY29kZSBmb3IgYWRhcHRlcnMKICAgdGhhdCBjYW5ub3QgcmVhZCBTQ0wgYmFjayAqLwpzdGF0aWMgc3RydWN0IGkyY19hbGdvX2JpdF9kYXRhIHBhcnBvcnRfYWxnb19kYXRhID0gewoJLnNldHNkYQkJPSBwYXJwb3J0X3NldHNkYSwKCS5zZXRzY2wJCT0gcGFycG9ydF9zZXRzY2wsCgkuZ2V0c2RhCQk9IHBhcnBvcnRfZ2V0c2RhLAoJLmdldHNjbAkJPSBwYXJwb3J0X2dldHNjbCwKCS51ZGVsYXkJCT0gNTAsCgkubWRlbGF5CQk9IDUwLAoJLnRpbWVvdXQJPSBIWiwKfTsgCgovKiAtLS0tLSBJMmMgc3RydWN0dXJlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCnN0YXRpYyBzdHJ1Y3QgaTJjX2FkYXB0ZXIgcGFycG9ydF9hZGFwdGVyID0gewoJLm93bmVyCQk9IFRISVNfTU9EVUxFLAoJLmNsYXNzCQk9IEkyQ19DTEFTU19IV01PTiwKCS5pZAkJPSBJMkNfSFdfQl9MUCwKCS5hbGdvX2RhdGEJPSAmcGFycG9ydF9hbGdvX2RhdGEsCgkubmFtZQkJPSAiUGFyYWxsZWwgcG9ydCBhZGFwdGVyIChsaWdodCkiLAp9OwoKLyogLS0tLS0gTW9kdWxlIGxvYWRpbmcsIHVubG9hZGluZyBhbmQgaW5mb3JtYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgpzdGF0aWMgaW50IF9faW5pdCBpMmNfcGFycG9ydF9pbml0KHZvaWQpCnsKCWludCB0eXBlX2NvdW50OwoKCXR5cGVfY291bnQgPSBzaXplb2YoYWRhcHRlcl9wYXJtKS9zaXplb2Yoc3RydWN0IGFkYXB0ZXJfcGFybSk7CglpZiAodHlwZSA8IDAgfHwgdHlwZSA+PSB0eXBlX2NvdW50KSB7CgkJcHJpbnRrKEtFUk5fV0FSTklORyAiaTJjLXBhcnBvcnQ6IGludmFsaWQgdHlwZSAoJWQpXG4iLCB0eXBlKTsKCQl0eXBlID0gMDsKCX0KCQoJaWYgKGJhc2UgPT0gMCkgewoJCXByaW50ayhLRVJOX0lORk8gImkyYy1wYXJwb3J0OiB1c2luZyBkZWZhdWx0IGJhc2UgMHgleFxuIiwgREVGQVVMVF9CQVNFKTsKCQliYXNlID0gREVGQVVMVF9CQVNFOwoJfQoKCWlmICghcmVxdWVzdF9yZWdpb24oYmFzZSwgMywgImkyYy1wYXJwb3J0IikpCgkJcmV0dXJuIC1FTk9ERVY7CgogICAgICAgIGlmICghYWRhcHRlcl9wYXJtW3R5cGVdLmdldHNjbC52YWwpCgkJcGFycG9ydF9hbGdvX2RhdGEuZ2V0c2NsID0gTlVMTDsKCgkvKiBSZXNldCBoYXJkd2FyZSB0byBhIHNhbmUgc3RhdGUgKFNDTCBhbmQgU0RBIGhpZ2gpICovCglwYXJwb3J0X3NldHNkYShOVUxMLCAxKTsKCXBhcnBvcnRfc2V0c2NsKE5VTEwsIDEpOwoJLyogT3RoZXIgaW5pdCBpZiBuZWVkZWQgKHBvd2VyIG9uLi4uKSAqLwoJaWYgKGFkYXB0ZXJfcGFybVt0eXBlXS5pbml0LnZhbCkKCQlsaW5lX3NldCgxLCAmYWRhcHRlcl9wYXJtW3R5cGVdLmluaXQpOwoKCWlmIChpMmNfYml0X2FkZF9idXMoJnBhcnBvcnRfYWRhcHRlcikgPCAwKSB7CgkJcHJpbnRrKEtFUk5fRVJSICJpMmMtcGFycG9ydDogVW5hYmxlIHRvIHJlZ2lzdGVyIHdpdGggSTJDXG4iKTsKCQlyZWxlYXNlX3JlZ2lvbihiYXNlLCAzKTsKCQlyZXR1cm4gLUVOT0RFVjsKCX0KCQoJcmV0dXJuIDA7Cn0KCnN0YXRpYyB2b2lkIF9fZXhpdCBpMmNfcGFycG9ydF9leGl0KHZvaWQpCnsKCS8qIFVuLWluaXQgaWYgbmVlZGVkIChwb3dlciBvZmYuLi4pICovCglpZiAoYWRhcHRlcl9wYXJtW3R5cGVdLmluaXQudmFsKQoJCWxpbmVfc2V0KDAsICZhZGFwdGVyX3Bhcm1bdHlwZV0uaW5pdCk7CgoJaTJjX2JpdF9kZWxfYnVzKCZwYXJwb3J0X2FkYXB0ZXIpOwoJcmVsZWFzZV9yZWdpb24oYmFzZSwgMyk7Cn0KCk1PRFVMRV9BVVRIT1IoIkplYW4gRGVsdmFyZSA8a2hhbGlAbGludXgtZnIub3JnPiIpOwpNT0RVTEVfREVTQ1JJUFRJT04oIkkyQyBidXMgb3ZlciBwYXJhbGxlbCBwb3J0IChsaWdodCkiKTsKTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwoKbW9kdWxlX2luaXQoaTJjX3BhcnBvcnRfaW5pdCk7Cm1vZHVsZV9leGl0KGkyY19wYXJwb3J0X2V4aXQpOwo=