LyoKICogbGludXgvZHJpdmVycy9zMzkwL2Npby9jbWYuYwogKgogKiBMaW51eCBvbiB6U2VyaWVzIENoYW5uZWwgTWVhc3VyZW1lbnQgRmFjaWxpdHkgc3VwcG9ydAogKgogKiBDb3B5cmlnaHQgMjAwMCwyMDA2IElCTSBDb3Jwb3JhdGlvbgogKgogKiBBdXRob3JzOiBBcm5kIEJlcmdtYW5uIDxhcm5kYkBkZS5pYm0uY29tPgogKgkgICAgQ29ybmVsaWEgSHVjayA8Y29ybmVsaWEuaHVja0BkZS5pYm0uY29tPgogKgogKiBvcmlnaW5hbCBpZGVhIGZyb20gTmF0YXJhamFuIEtyaXNobmFzd2FtaSA8bmtyaXNobmFAdXMuaWJtLmNvbT4KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQogKiBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCiAqLwoKI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgojaW5jbHVkZSA8bGludXgvaW5pdC5oPgojaW5jbHVkZSA8bGludXgvbGlzdC5oPgojaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgojaW5jbHVkZSA8bGludXgvc2xhYi5oPgojaW5jbHVkZSA8bGludXgvdGltZXguaD4JLyogZ2V0X2Nsb2NrKCkgKi8KCiNpbmNsdWRlIDxhc20vY2N3ZGV2Lmg+CiNpbmNsdWRlIDxhc20vY2lvLmg+CiNpbmNsdWRlIDxhc20vY21iLmg+CiNpbmNsdWRlIDxhc20vZGl2NjQuaD4KCiNpbmNsdWRlICJjaW8uaCIKI2luY2x1ZGUgImNzcy5oIgojaW5jbHVkZSAiZGV2aWNlLmgiCiNpbmNsdWRlICJpb2FzbS5oIgojaW5jbHVkZSAiY2hzYy5oIgoKLyogcGFyYW1ldGVyIHRvIGVuYWJsZSBjbWYgZHVyaW5nIGJvb3QsIHBvc3NpYmxlIHVzZXMgYXJlOgogKiAgInMzOTBjbWYiIC0tIGVuYWJsZSBjbWYgYW5kIGFsbG9jYXRlIDIgTUIgb2YgcmFtIHNvIG1lYXN1cmluZyBjYW4gYmUKICogICAgICAgICAgICAgICB1c2VkIG9uIGFueSBzdWJjaGFubmVsCiAqICAiczM5MGNtZj08bnVtPiIgLS0gZW5hYmxlIGNtZiBhbmQgYWxsb2NhdGUgZW5vdWdoIG1lbW9yeSB0byBtZWFzdXJlCiAqICAgICAgICAgICAgICAgICAgICAgPG51bT4gc3ViY2hhbm5lbCwgd2hlcmUgPG51bT4gaXMgYW4gaW50ZWdlcgogKiAgICAgICAgICAgICAgICAgICAgIGJldHdlZW4gMSBhbmQgNjU1MzUsIGRlZmF1bHQgaXMgMTAyNAogKi8KI2RlZmluZSBBUkdTVFJJTkcgInMzOTBjbWYiCgovKiBpbmRpY2VzIGZvciBSRUFEQ01CICovCmVudW0gY21iX2luZGV4IHsKIC8qIGJhc2ljIGFuZCBleGVuZGVkIGZvcm1hdDogKi8KCWNtYl9zc2NoX3JzY2hfY291bnQsCgljbWJfc2FtcGxlX2NvdW50LAoJY21iX2RldmljZV9jb25uZWN0X3RpbWUsCgljbWJfZnVuY3Rpb25fcGVuZGluZ190aW1lLAoJY21iX2RldmljZV9kaXNjb25uZWN0X3RpbWUsCgljbWJfY29udHJvbF91bml0X3F1ZXVpbmdfdGltZSwKCWNtYl9kZXZpY2VfYWN0aXZlX29ubHlfdGltZSwKIC8qIGV4dGVuZGVkIGZvcm1hdCBvbmx5OiAqLwoJY21iX2RldmljZV9idXN5X3RpbWUsCgljbWJfaW5pdGlhbF9jb21tYW5kX3Jlc3BvbnNlX3RpbWUsCn07CgovKioKICogZW51bSBjbWJfZm9ybWF0IC0gdHlwZXMgb2Ygc3VwcG9ydGVkIG1lYXN1cmVtZW50IGJsb2NrIGZvcm1hdHMKICoKICogQENNRl9CQVNJQzogICAgICB0cmFkaXRpb25hbCBjaGFubmVsIG1lYXN1cmVtZW50IGJsb2NrcyBzdXBwb3J0ZWQKICogCQkgICAgYnkgYWxsIG1hY2hpbmVzIHRoYXQgd2UgcnVuIG9uCiAqIEBDTUZfRVhURU5ERUQ6ICAgaW1wcm92ZWQgZm9ybWF0IHRoYXQgd2FzIGludHJvZHVjZWQgd2l0aCB0aGUgejk5MAogKiAJCSAgICBtYWNoaW5lCiAqIEBDTUZfQVVUT0RFVEVDVDogZGVmYXVsdDogdXNlIGV4dGVuZGVkIGZvcm1hdCB3aGVuIHJ1bm5pbmcgb24gYSB6OTkwCiAqICAgICAgICAgICAgICAgICAgb3IgbGF0ZXIgbWFjaGluZSwgb3RoZXJ3aXNlIGZhbGwgYmFjayB0byBiYXNpYyBmb3JtYXQKICoqLwplbnVtIGNtYl9mb3JtYXQgewoJQ01GX0JBU0lDLAoJQ01GX0VYVEVOREVELAoJQ01GX0FVVE9ERVRFQ1QgPSAtMSwKfTsKLyoqCiAqIGZvcm1hdCAtIGFjdHVhbCBmb3JtYXQgZm9yIGFsbCBtZWFzdXJlbWVudCBibG9ja3MKICoKICogVGhlIGZvcm1hdCBtb2R1bGUgcGFyYW1ldGVyIGNhbiBiZSBzZXQgdG8gYSB2YWx1ZSBvZiAwICh6ZXJvKQogKiBvciAxLCBpbmRpY2F0aW5nIGJhc2ljIG9yIGV4dGVuZGVkIGZvcm1hdCBhcyBkZXNjcmliZWQgZm9yCiAqIGVudW0gY21iX2Zvcm1hdC4KICovCnN0YXRpYyBpbnQgZm9ybWF0ID0gQ01GX0FVVE9ERVRFQ1Q7Cm1vZHVsZV9wYXJhbShmb3JtYXQsIGJvb2wsIDA0NDQpOwoKLyoqCiAqIHN0cnVjdCBjbWJfb3BlcmF0aW9ucyAtIGZ1bmN0aW9ucyB0byB1c2UgZGVwZW5kaW5nIG9uIGNtYl9mb3JtYXQKICoKICogTW9zdCBvZiB0aGVzZSBmdW5jdGlvbnMgb3BlcmF0ZSBvbiBhIHN0cnVjdCBjY3dfZGV2aWNlLiBUaGVyZSBpcyBvbmx5CiAqIG9uZSBpbnN0YW5jZSBvZiBzdHJ1Y3QgY21iX29wZXJhdGlvbnMgYmVjYXVzZSB0aGUgZm9ybWF0IG9mIHRoZSBtZWFzdXJlbWVudAogKiBkYXRhIGlzIGd1YXJhbnRlZWQgdG8gYmUgdGhlIHNhbWUgZm9yIGV2ZXJ5IGNjd19kZXZpY2UuCiAqCiAqIEBhbGxvYzoJYWxsb2NhdGUgbWVtb3J5IGZvciBhIGNoYW5uZWwgbWVhc3VyZW1lbnQgYmxvY2ssCiAqCQllaXRoZXIgd2l0aCB0aGUgaGVscCBvZiBhIHNwZWNpYWwgcG9vbCBvciB3aXRoIGttYWxsb2MKICogQGZyZWU6CWZyZWUgbWVtb3J5IGFsbG9jYXRlZCB3aXRoIEBhbGxvYwogKiBAc2V0OgllbmFibGUgb3IgZGlzYWJsZSBtZWFzdXJlbWVudAogKiBAcmVhZGFsbDoJcmVhZCBhIG1lYXN1cmVtZW50IGJsb2NrIGluIGEgY29tbW9uIGZvcm1hdAogKiBAcmVzZXQ6CWNsZWFyIHRoZSBkYXRhIGluIHRoZSBhc3NvY2lhdGVkIG1lYXN1cmVtZW50IGJsb2NrIGFuZAogKgkJcmVzZXQgaXRzIHRpbWUgc3RhbXAKICogQGFsaWduOglhbGlnbiBhbiBhbGxvY2F0ZWQgYmxvY2sgc28gdGhhdCB0aGUgaGFyZHdhcmUgY2FuIHVzZSBpdAogKi8Kc3RydWN0IGNtYl9vcGVyYXRpb25zIHsKCWludCAoKmFsbG9jKSAgKHN0cnVjdCBjY3dfZGV2aWNlKik7Cgl2b2lkKCpmcmVlKSAgIChzdHJ1Y3QgY2N3X2RldmljZSopOwoJaW50ICgqc2V0KSAgICAoc3RydWN0IGNjd19kZXZpY2UqLCB1MzIpOwoJdTY0ICgqcmVhZCkgICAoc3RydWN0IGNjd19kZXZpY2UqLCBpbnQpOwoJaW50ICgqcmVhZGFsbCkoc3RydWN0IGNjd19kZXZpY2UqLCBzdHJ1Y3QgY21iZGF0YSAqKTsKCXZvaWQgKCpyZXNldCkgKHN0cnVjdCBjY3dfZGV2aWNlKik7Cgl2b2lkICogKCphbGlnbikgKHZvaWQgKik7CgoJc3RydWN0IGF0dHJpYnV0ZV9ncm91cCAqYXR0cl9ncm91cDsKfTsKc3RhdGljIHN0cnVjdCBjbWJfb3BlcmF0aW9ucyAqY21ib3BzOwoKc3RydWN0IGNtYl9kYXRhIHsKCXZvaWQgKmh3X2Jsb2NrOyAgIC8qIFBvaW50ZXIgdG8gYmxvY2sgdXBkYXRlZCBieSBoYXJkd2FyZSAqLwoJdm9pZCAqbGFzdF9ibG9jazsgLyogTGFzdCBjaGFuZ2VkIGJsb2NrIGNvcGllZCBmcm9tIGhhcmR3YXJlIGJsb2NrICovCglpbnQgc2l6ZTsJICAvKiBTaXplIG9mIGh3X2Jsb2NrIGFuZCBsYXN0X2Jsb2NrICovCgl1bnNpZ25lZCBsb25nIGxvbmcgbGFzdF91cGRhdGU7ICAvKiB3aGVuIGxhc3RfYmxvY2sgd2FzIHVwZGF0ZWQgKi8KfTsKCi8qIG91ciB1c2VyIGludGVyZmFjZSBpcyBkZXNpZ25lZCBpbiB0ZXJtcyBvZiBuYW5vc2Vjb25kcywKICogd2hpbGUgdGhlIGhhcmR3YXJlIG1lYXN1cmVzIHRvdGFsIHRpbWVzIGluIGl0cyBvd24KICogdW5pdC4qLwpzdGF0aWMgaW5saW5lIHU2NCB0aW1lX3RvX25zZWModTMyIHZhbHVlKQp7CglyZXR1cm4gKCh1NjQpdmFsdWUpICogMTI4MDAwdWxsOwp9CgovKgogKiBVc2VycyBhcmUgdXN1YWxseSBpbnRlcmVzdGVkIGluIGF2ZXJhZ2UgdGltZXMsCiAqIG5vdCBhY2N1bXVsYXRlZCB0aW1lLgogKiBUaGlzIGFsc28gaGVscHMgdXMgd2l0aCBhdG9taWNpdHkgcHJvYmxlbXMKICogd2hlbiByZWFkaW5nIHNpbmxnZSB2YWx1ZXMuCiAqLwpzdGF0aWMgaW5saW5lIHU2NCB0aW1lX3RvX2F2Z19uc2VjKHUzMiB2YWx1ZSwgdTMyIGNvdW50KQp7Cgl1NjQgcmV0OwoKCS8qIG5vIHNhbXBsZXMgeWV0LCBhdm9pZCBkaXZpc2lvbiBieSAwICovCglpZiAoY291bnQgPT0gMCkKCQlyZXR1cm4gMDsKCgkvKiB2YWx1ZSBjb21lcyBpbiB1bml0cyBvZiAxMjggtXNlYyAqLwoJcmV0ID0gdGltZV90b19uc2VjKHZhbHVlKTsKCWRvX2RpdihyZXQsIGNvdW50KTsKCglyZXR1cm4gcmV0Owp9CgovKiBhY3RpdmF0ZSBvciBkZWFjdGl2YXRlIHRoZSBjaGFubmVsIG1vbml0b3IuIFdoZW4gYXJlYSBpcyBOVUxMLAogKiB0aGUgbW9uaXRvciBpcyBkZWFjdGl2YXRlZC4gVGhlIGNoYW5uZWwgbW9uaXRvciBuZWVkcyB0bwogKiBiZSBhY3RpdmUgaW4gb3JkZXIgdG8gbWVhc3VyZSBzdWJjaGFubmVscywgd2hpY2ggYWxzbyBuZWVkCiAqIHRvIGJlIGVuYWJsZWQuICovCnN0YXRpYyBpbmxpbmUgdm9pZApjbWZfYWN0aXZhdGUodm9pZCAqYXJlYSwgdW5zaWduZWQgaW50IG9ub2ZmKQp7CglyZWdpc3RlciB2b2lkICogX19ncHIyIGFzbSgiMiIpOwoJcmVnaXN0ZXIgbG9uZyBfX2dwcjEgYXNtKCIxIik7CgoJX19ncHIyID0gYXJlYTsKCV9fZ3ByMSA9IG9ub2ZmID8gMiA6IDA7CgkvKiBhY3RpdmF0ZSBjaGFubmVsIG1lYXN1cmVtZW50ICovCglhc20oInNjaG0iIDogOiAiZCIgKF9fZ3ByMiksICJkIiAoX19ncHIxKSApOwp9CgpzdGF0aWMgaW50CnNldF9zY2hpYihzdHJ1Y3QgY2N3X2RldmljZSAqY2RldiwgdTMyIG1tZSwgaW50IG1iZmMsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcykKewoJaW50IHJldDsKCWludCByZXRyeTsKCXN0cnVjdCBzdWJjaGFubmVsICpzY2g7CglzdHJ1Y3Qgc2NoaWIgKnNjaGliOwoKCXNjaCA9IHRvX3N1YmNoYW5uZWwoY2Rldi0+ZGV2LnBhcmVudCk7CglzY2hpYiA9ICZzY2gtPnNjaGliOwoJLyogbXNjaCBjYW4gc2lsZW50bHkgZmFpbCwgc28gZG8gaXQgYWdhaW4gaWYgbmVjZXNzYXJ5ICovCglmb3IgKHJldHJ5ID0gMDsgcmV0cnkgPCAzOyByZXRyeSsrKSB7CgkJLyogcHJlcGFyZSBzY2hpYiAqLwoJCXN0c2NoKHNjaC0+c2NoaWQsIHNjaGliKTsKCQlzY2hpYi0+cG1jdy5tbWUgID0gbW1lOwoJCXNjaGliLT5wbWN3Lm1iZmMgPSBtYmZjOwoJCS8qIGFkZHJlc3MgY2FuIGJlIGVpdGhlciBhIGJsb2NrIGFkZHJlc3Mgb3IgYSBibG9jayBpbmRleCAqLwoJCWlmIChtYmZjKQoJCQlzY2hpYi0+bWJhID0gYWRkcmVzczsKCQllbHNlCgkJCXNjaGliLT5wbWN3Lm1iaSA9IGFkZHJlc3M7CgoJCS8qIHRyeSB0byBzdWJtaXQgaXQgKi8KCQlzd2l0Y2gocmV0ID0gbXNjaF9lcnIoc2NoLT5zY2hpZCwgc2NoaWIpKSB7CgkJCWNhc2UgMDoKCQkJCWJyZWFrOwoJCQljYXNlIDE6CgkJCWNhc2UgMjogLyogaW4gSS9PIG9yIHN0YXR1cyBwZW5kaW5nICovCgkJCQlyZXQgPSAtRUJVU1k7CgkJCQlicmVhazsKCQkJY2FzZSAzOiAvKiBzdWJjaGFubmVsIGlzIG5vIGxvbmdlciB2YWxpZCAqLwoJCQkJcmV0ID0gLUVOT0RFVjsKCQkJCWJyZWFrOwoJCQlkZWZhdWx0OiAvKiBtc2NoIGNhdWdodCBhbiBleGNlcHRpb24gKi8KCQkJCXJldCA9IC1FSU5WQUw7CgkJCQlicmVhazsKCQl9CgkJc3RzY2goc2NoLT5zY2hpZCwgc2NoaWIpOyAvKiByZXN0b3JlIHRoZSBzY2hpYiAqLwoKCQlpZiAocmV0KQoJCQlicmVhazsKCgkJLyogY2hlY2sgaWYgaXQgd29ya2VkICovCgkJaWYgKHNjaGliLT5wbWN3Lm1tZSAgPT0gbW1lICYmCgkJICAgIHNjaGliLT5wbWN3Lm1iZmMgPT0gbWJmYyAmJgoJCSAgICAobWJmYyA/IChzY2hpYi0+bWJhID09IGFkZHJlc3MpCgkJCSAgOiAoc2NoaWItPnBtY3cubWJpID09IGFkZHJlc3MpKSkKCQkJcmV0dXJuIDA7CgoJCXJldCA9IC1FSU5WQUw7Cgl9CgoJcmV0dXJuIHJldDsKfQoKc3RydWN0IHNldF9zY2hpYl9zdHJ1Y3QgewoJdTMyIG1tZTsKCWludCBtYmZjOwoJdW5zaWduZWQgbG9uZyBhZGRyZXNzOwoJd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdDsKCWludCByZXQ7CglzdHJ1Y3Qga3JlZiBrcmVmOwp9OwoKc3RhdGljIHZvaWQgY21mX3NldF9zY2hpYl9yZWxlYXNlKHN0cnVjdCBrcmVmICprcmVmKQp7CglzdHJ1Y3Qgc2V0X3NjaGliX3N0cnVjdCAqc2V0X2RhdGE7CgoJc2V0X2RhdGEgPSBjb250YWluZXJfb2Yoa3JlZiwgc3RydWN0IHNldF9zY2hpYl9zdHJ1Y3QsIGtyZWYpOwoJa2ZyZWUoc2V0X2RhdGEpOwp9CgojZGVmaW5lIENNRl9QRU5ESU5HIDEKCnN0YXRpYyBpbnQgc2V0X3NjaGliX3dhaXQoc3RydWN0IGNjd19kZXZpY2UgKmNkZXYsIHUzMiBtbWUsCgkJCQlpbnQgbWJmYywgdW5zaWduZWQgbG9uZyBhZGRyZXNzKQp7CglzdHJ1Y3Qgc2V0X3NjaGliX3N0cnVjdCAqc2V0X2RhdGE7CglpbnQgcmV0OwoKCXNwaW5fbG9ja19pcnEoY2Rldi0+Y2N3bG9jayk7CglpZiAoIWNkZXYtPnByaXZhdGUtPmNtYikgewoJCXJldCA9IC1FTk9ERVY7CgkJZ290byBvdXQ7Cgl9CglzZXRfZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzZXRfc2NoaWJfc3RydWN0KSwgR0ZQX0FUT01JQyk7CglpZiAoIXNldF9kYXRhKSB7CgkJcmV0ID0gLUVOT01FTTsKCQlnb3RvIG91dDsKCX0KCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnNldF9kYXRhLT53YWl0KTsKCWtyZWZfaW5pdCgmc2V0X2RhdGEtPmtyZWYpOwoJc2V0X2RhdGEtPm1tZSA9IG1tZTsKCXNldF9kYXRhLT5tYmZjID0gbWJmYzsKCXNldF9kYXRhLT5hZGRyZXNzID0gYWRkcmVzczsKCglyZXQgPSBzZXRfc2NoaWIoY2RldiwgbW1lLCBtYmZjLCBhZGRyZXNzKTsKCWlmIChyZXQgIT0gLUVCVVNZKQoJCWdvdG8gb3V0X3B1dDsKCglpZiAoY2Rldi0+cHJpdmF0ZS0+c3RhdGUgIT0gREVWX1NUQVRFX09OTElORSkgewoJCS8qIGlmIHRoZSBkZXZpY2UgaXMgbm90IG9ubGluZSwgZG9uJ3QgZXZlbiB0cnkgYWdhaW4gKi8KCQlyZXQgPSAtRUJVU1k7CgkJZ290byBvdXRfcHV0OwoJfQoKCWNkZXYtPnByaXZhdGUtPnN0YXRlID0gREVWX1NUQVRFX0NNRkNIQU5HRTsKCXNldF9kYXRhLT5yZXQgPSBDTUZfUEVORElORzsKCWNkZXYtPnByaXZhdGUtPmNtYl93YWl0ID0gc2V0X2RhdGE7CgoJc3Bpbl91bmxvY2tfaXJxKGNkZXYtPmNjd2xvY2spOwoJaWYgKHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShzZXRfZGF0YS0+d2FpdCwKCQkJCSAgICAgc2V0X2RhdGEtPnJldCAhPSBDTUZfUEVORElORykpIHsKCQlzcGluX2xvY2tfaXJxKGNkZXYtPmNjd2xvY2spOwoJCWlmIChzZXRfZGF0YS0+cmV0ID09IENNRl9QRU5ESU5HKSB7CgkJCXNldF9kYXRhLT5yZXQgPSAtRVJFU1RBUlRTWVM7CgkJCWlmIChjZGV2LT5wcml2YXRlLT5zdGF0ZSA9PSBERVZfU1RBVEVfQ01GQ0hBTkdFKQoJCQkJY2Rldi0+cHJpdmF0ZS0+c3RhdGUgPSBERVZfU1RBVEVfT05MSU5FOwoJCX0KCQlzcGluX3VubG9ja19pcnEoY2Rldi0+Y2N3bG9jayk7Cgl9CglzcGluX2xvY2tfaXJxKGNkZXYtPmNjd2xvY2spOwoJY2Rldi0+cHJpdmF0ZS0+Y21iX3dhaXQgPSBOVUxMOwoJcmV0ID0gc2V0X2RhdGEtPnJldDsKb3V0X3B1dDoKCWtyZWZfcHV0KCZzZXRfZGF0YS0+a3JlZiwgY21mX3NldF9zY2hpYl9yZWxlYXNlKTsKb3V0OgoJc3Bpbl91bmxvY2tfaXJxKGNkZXYtPmNjd2xvY2spOwoJcmV0dXJuIHJldDsKfQoKdm9pZCByZXRyeV9zZXRfc2NoaWIoc3RydWN0IGNjd19kZXZpY2UgKmNkZXYpCnsKCXN0cnVjdCBzZXRfc2NoaWJfc3RydWN0ICpzZXRfZGF0YTsKCglzZXRfZGF0YSA9IGNkZXYtPnByaXZhdGUtPmNtYl93YWl0OwoJaWYgKCFzZXRfZGF0YSkgewoJCVdBUk5fT04oMSk7CgkJcmV0dXJuOwoJfQoJa3JlZl9nZXQoJnNldF9kYXRhLT5rcmVmKTsKCXNldF9kYXRhLT5yZXQgPSBzZXRfc2NoaWIoY2Rldiwgc2V0X2RhdGEtPm1tZSwgc2V0X2RhdGEtPm1iZmMsCgkJCQkgIHNldF9kYXRhLT5hZGRyZXNzKTsKCXdha2VfdXAoJnNldF9kYXRhLT53YWl0KTsKCWtyZWZfcHV0KCZzZXRfZGF0YS0+a3JlZiwgY21mX3NldF9zY2hpYl9yZWxlYXNlKTsKfQoKc3RhdGljIGludCBjbWZfY29weV9ibG9jayhzdHJ1Y3QgY2N3X2RldmljZSAqY2RldikKewoJc3RydWN0IHN1YmNoYW5uZWwgKnNjaDsKCXZvaWQgKnJlZmVyZW5jZV9idWY7Cgl2b2lkICpod19ibG9jazsKCXN0cnVjdCBjbWJfZGF0YSAqY21iX2RhdGE7CgoJc2NoID0gdG9fc3ViY2hhbm5lbChjZGV2LT5kZXYucGFyZW50KTsKCglpZiAoc3RzY2goc2NoLT5zY2hpZCwgJnNjaC0+c2NoaWIpKQoJCXJldHVybiAtRU5PREVWOwoKCWlmIChzY2gtPnNjaGliLnNjc3cuZmN0bCAmIFNDU1dfRkNUTF9TVEFSVF9GVU5DKSB7CgkJLyogRG9uJ3QgY29weSBpZiBhIHN0YXJ0IGZ1bmN0aW9uIGlzIGluIHByb2dyZXNzLiAqLwoJCWlmICgoIXNjaC0+c2NoaWIuc2Nzdy5hY3RsICYgU0NTV19BQ1RMX1NVU1BFTkRFRCkgJiYKCQkgICAgKHNjaC0+c2NoaWIuc2Nzdy5hY3RsICYKCQkgICAgIChTQ1NXX0FDVExfREVWQUNUIHwgU0NTV19BQ1RMX1NDSEFDVCkpICYmCgkJICAgICghc2NoLT5zY2hpYi5zY3N3LnN0Y3RsICYgU0NTV19TVENUTF9TRUNfU1RBVFVTKSkKCQkJcmV0dXJuIC1FQlVTWTsKCX0KCWNtYl9kYXRhID0gY2Rldi0+cHJpdmF0ZS0+Y21iOwoJaHdfYmxvY2sgPSBjbWJvcHMtPmFsaWduKGNtYl9kYXRhLT5od19ibG9jayk7CglpZiAoIW1lbWNtcChjbWJfZGF0YS0+bGFzdF9ibG9jaywgaHdfYmxvY2ssIGNtYl9kYXRhLT5zaXplKSkKCQkvKiBObyBuZWVkIHRvIGNvcHkuICovCgkJcmV0dXJuIDA7CglyZWZlcmVuY2VfYnVmID0ga3phbGxvYyhjbWJfZGF0YS0+c2l6ZSwgR0ZQX0FUT01JQyk7CglpZiAoIXJlZmVyZW5jZV9idWYpCgkJcmV0dXJuIC1FTk9NRU07CgkvKiBFbnN1cmUgY29uc2lzdGVuY3kgb2YgYmxvY2sgY29waWVkIGZyb20gaGFyZHdhcmUuICovCglkbyB7CgkJbWVtY3B5KGNtYl9kYXRhLT5sYXN0X2Jsb2NrLCBod19ibG9jaywgY21iX2RhdGEtPnNpemUpOwoJCW1lbWNweShyZWZlcmVuY2VfYnVmLCBod19ibG9jaywgY21iX2RhdGEtPnNpemUpOwoJfSB3aGlsZSAobWVtY21wKGNtYl9kYXRhLT5sYXN0X2Jsb2NrLCByZWZlcmVuY2VfYnVmLCBjbWJfZGF0YS0+c2l6ZSkpOwoJY21iX2RhdGEtPmxhc3RfdXBkYXRlID0gZ2V0X2Nsb2NrKCk7CglrZnJlZShyZWZlcmVuY2VfYnVmKTsKCXJldHVybiAwOwp9CgpzdHJ1Y3QgY29weV9ibG9ja19zdHJ1Y3QgewoJd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdDsKCWludCByZXQ7CglzdHJ1Y3Qga3JlZiBrcmVmOwp9OwoKc3RhdGljIHZvaWQgY21mX2NvcHlfYmxvY2tfcmVsZWFzZShzdHJ1Y3Qga3JlZiAqa3JlZikKewoJc3RydWN0IGNvcHlfYmxvY2tfc3RydWN0ICpjb3B5X2Jsb2NrOwoKCWNvcHlfYmxvY2sgPSBjb250YWluZXJfb2Yoa3JlZiwgc3RydWN0IGNvcHlfYmxvY2tfc3RydWN0LCBrcmVmKTsKCWtmcmVlKGNvcHlfYmxvY2spOwp9CgpzdGF0aWMgaW50IGNtZl9jbWJfY29weV93YWl0KHN0cnVjdCBjY3dfZGV2aWNlICpjZGV2KQp7CglzdHJ1Y3QgY29weV9ibG9ja19zdHJ1Y3QgKmNvcHlfYmxvY2s7CglpbnQgcmV0OwoJdW5zaWduZWQgbG9uZyBmbGFnczsKCglzcGluX2xvY2tfaXJxc2F2ZShjZGV2LT5jY3dsb2NrLCBmbGFncyk7CglpZiAoIWNkZXYtPnByaXZhdGUtPmNtYikgewoJCXJldCA9IC1FTk9ERVY7CgkJZ290byBvdXQ7Cgl9Cgljb3B5X2Jsb2NrID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGNvcHlfYmxvY2tfc3RydWN0KSwgR0ZQX0FUT01JQyk7CglpZiAoIWNvcHlfYmxvY2spIHsKCQlyZXQgPSAtRU5PTUVNOwoJCWdvdG8gb3V0OwoJfQoJaW5pdF93YWl0cXVldWVfaGVhZCgmY29weV9ibG9jay0+d2FpdCk7CglrcmVmX2luaXQoJmNvcHlfYmxvY2stPmtyZWYpOwoKCXJldCA9IGNtZl9jb3B5X2Jsb2NrKGNkZXYpOwoJaWYgKHJldCAhPSAtRUJVU1kpCgkJZ290byBvdXRfcHV0OwoKCWlmIChjZGV2LT5wcml2YXRlLT5zdGF0ZSAhPSBERVZfU1RBVEVfT05MSU5FKSB7CgkJcmV0ID0gLUVCVVNZOwoJCWdvdG8gb3V0X3B1dDsKCX0KCgljZGV2LT5wcml2YXRlLT5zdGF0ZSA9IERFVl9TVEFURV9DTUZVUERBVEU7Cgljb3B5X2Jsb2NrLT5yZXQgPSBDTUZfUEVORElORzsKCWNkZXYtPnByaXZhdGUtPmNtYl93YWl0ID0gY29weV9ibG9jazsKCglzcGluX3VubG9ja19pcnFyZXN0b3JlKGNkZXYtPmNjd2xvY2ssIGZsYWdzKTsKCWlmICh3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoY29weV9ibG9jay0+d2FpdCwKCQkJCSAgICAgY29weV9ibG9jay0+cmV0ICE9IENNRl9QRU5ESU5HKSkgewoJCXNwaW5fbG9ja19pcnFzYXZlKGNkZXYtPmNjd2xvY2ssIGZsYWdzKTsKCQlpZiAoY29weV9ibG9jay0+cmV0ID09IENNRl9QRU5ESU5HKSB7CgkJCWNvcHlfYmxvY2stPnJldCA9IC1FUkVTVEFSVFNZUzsKCQkJaWYgKGNkZXYtPnByaXZhdGUtPnN0YXRlID09IERFVl9TVEFURV9DTUZVUERBVEUpCgkJCQljZGV2LT5wcml2YXRlLT5zdGF0ZSA9IERFVl9TVEFURV9PTkxJTkU7CgkJfQoJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoY2Rldi0+Y2N3bG9jaywgZmxhZ3MpOwoJfQoJc3Bpbl9sb2NrX2lycXNhdmUoY2Rldi0+Y2N3bG9jaywgZmxhZ3MpOwoJY2Rldi0+cHJpdmF0ZS0+Y21iX3dhaXQgPSBOVUxMOwoJcmV0ID0gY29weV9ibG9jay0+cmV0OwpvdXRfcHV0OgoJa3JlZl9wdXQoJmNvcHlfYmxvY2stPmtyZWYsIGNtZl9jb3B5X2Jsb2NrX3JlbGVhc2UpOwpvdXQ6CglzcGluX3VubG9ja19pcnFyZXN0b3JlKGNkZXYtPmNjd2xvY2ssIGZsYWdzKTsKCXJldHVybiByZXQ7Cn0KCnZvaWQgY21mX3JldHJ5X2NvcHlfYmxvY2soc3RydWN0IGNjd19kZXZpY2UgKmNkZXYpCnsKCXN0cnVjdCBjb3B5X2Jsb2NrX3N0cnVjdCAqY29weV9ibG9jazsKCgljb3B5X2Jsb2NrID0gY2Rldi0+cHJpdmF0ZS0+Y21iX3dhaXQ7CglpZiAoIWNvcHlfYmxvY2spIHsKCQlXQVJOX09OKDEpOwoJCXJldHVybjsKCX0KCWtyZWZfZ2V0KCZjb3B5X2Jsb2NrLT5rcmVmKTsKCWNvcHlfYmxvY2stPnJldCA9IGNtZl9jb3B5X2Jsb2NrKGNkZXYpOwoJd2FrZV91cCgmY29weV9ibG9jay0+d2FpdCk7CglrcmVmX3B1dCgmY29weV9ibG9jay0+a3JlZiwgY21mX2NvcHlfYmxvY2tfcmVsZWFzZSk7Cn0KCnN0YXRpYyB2b2lkIGNtZl9nZW5lcmljX3Jlc2V0KHN0cnVjdCBjY3dfZGV2aWNlICpjZGV2KQp7CglzdHJ1Y3QgY21iX2RhdGEgKmNtYl9kYXRhOwoKCXNwaW5fbG9ja19pcnEoY2Rldi0+Y2N3bG9jayk7CgljbWJfZGF0YSA9IGNkZXYtPnByaXZhdGUtPmNtYjsKCWlmIChjbWJfZGF0YSkgewoJCW1lbXNldChjbWJfZGF0YS0+bGFzdF9ibG9jaywgMCwgY21iX2RhdGEtPnNpemUpOwoJCS8qCgkJICogTmVlZCB0byByZXNldCBodyBibG9jayBhcyB3ZWxsIHRvIG1ha2UgdGhlIGhhcmR3YXJlIHN0YXJ0CgkJICogZnJvbSAwIGFnYWluLgoJCSAqLwoJCW1lbXNldChjbWJvcHMtPmFsaWduKGNtYl9kYXRhLT5od19ibG9jayksIDAsIGNtYl9kYXRhLT5zaXplKTsKCQljbWJfZGF0YS0+bGFzdF91cGRhdGUgPSAwOwoJfQoJY2Rldi0+cHJpdmF0ZS0+Y21iX3N0YXJ0X3RpbWUgPSBnZXRfY2xvY2soKTsKCXNwaW5fdW5sb2NrX2lycShjZGV2LT5jY3dsb2NrKTsKfQoKLyoqCiAqIHN0cnVjdCBjbWJfYXJlYSAtIGNvbnRhaW5lciBmb3IgZ2xvYmFsIGNtYiBkYXRhCiAqCiAqIEBtZW06CXBvaW50ZXIgdG8gQ01CcyAob25seSBpbiBiYXNpYyBtZWFzdXJlbWVudCBtb2RlKQogKiBAbGlzdDoJY29udGFpbnMgYSBsaW5rZWQgbGlzdCBvZiBhbGwgc3ViY2hhbm5lbHMKICogQGxvY2s6CXByb3RlY3QgY29uY3VycmVudCBhY2Nlc3MgdG8gQG1lbSBhbmQgQGxpc3QKICovCnN0cnVjdCBjbWJfYXJlYSB7CglzdHJ1Y3QgY21iICptZW07CglzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CglpbnQgbnVtX2NoYW5uZWxzOwoJc3BpbmxvY2tfdCBsb2NrOwp9OwoKc3RhdGljIHN0cnVjdCBjbWJfYXJlYSBjbWJfYXJlYSA9IHsKCS5sb2NrID0gX19TUElOX0xPQ0tfVU5MT0NLRUQoY21iX2FyZWEubG9jayksCgkubGlzdCA9IExJU1RfSEVBRF9JTklUKGNtYl9hcmVhLmxpc3QpLAoJLm51bV9jaGFubmVscyAgPSAxMDI0LAp9OwoKDAovKiAqKioqKiogb2xkIHN0eWxlIENNQiBoYW5kbGluZyAqKioqKioqKi8KCi8qKiBpbnQgbWF4Y2hhbm5lbHMKICoKICogQmFzaWMgY2hhbm5lbCBtZWFzdXJlbWVudCBibG9ja3MgYXJlIGFsbG9jYXRlZCBpbiBvbmUgY29udGlndW91cwogKiBibG9jayBvZiBtZW1vcnksIHdoaWNoIGNhbiBub3QgYmUgbW92ZWQgYXMgbG9uZyBhcyBhbnkgY2hhbm5lbAogKiBpcyBhY3RpdmUuIFRoZXJlZm9yZSwgYSBtYXhpbXVtIG51bWJlciBvZiBzdWJjaGFubmVscyBuZWVkcyB0bwogKiBiZSBkZWZpbmVkIHNvbWV3aGVyZS4gVGhpcyBpcyBhIG1vZHVsZSBwYXJhbWV0ZXIsIGRlZmF1bHRpbmcgdG8KICogYSByZXNvbmFibGUgdmFsdWUgb2YgMTAyNCwgb3IgMzIga2Igb2YgbWVtb3J5LgogKiBDdXJyZW50IGtlcm5lbHMgZG9uJ3QgYWxsb3cga21hbGxvYyB3aXRoIG1vcmUgdGhhbiAxMjhrYiwgc28gdGhlCiAqIG1heGltdW0gaXMgNDA5NgogKi8KCm1vZHVsZV9wYXJhbV9uYW1lZChtYXhjaGFubmVscywgY21iX2FyZWEubnVtX2NoYW5uZWxzLCB1aW50LCAwNDQ0KTsKCi8qKgogKiBzdHJ1Y3QgY21iIC0gYmFzaWMgY2hhbm5lbCBtZWFzdXJlbWVudCBibG9jawogKgogKiBjbWIgYXMgdXNlZCBieSB0aGUgaGFyZHdhcmUgdGhlIGZpZWxkcyBhcmUgZGVzY3JpYmVkIGluIHovQXJjaGl0ZWN0dXJlCiAqIFByaW5jaXBsZXMgb2YgT3BlcmF0aW9uLCBjaGFwdGVyIDE3LgogKiBUaGUgYXJlYSB0byBiZSBhIGNvbnRpZ3VvdXMgYXJyYXkgYW5kIG1heSBub3QgYmUgcmVhbGxvY2F0ZWQgb3IgZnJlZWQuCiAqIE9ubHkgb25lIGNtYiBhcmVhIGNhbiBiZSBwcmVzZW50IGluIHRoZSBzeXN0ZW0uCiAqLwpzdHJ1Y3QgY21iIHsKCXUxNiBzc2NoX3JzY2hfY291bnQ7Cgl1MTYgc2FtcGxlX2NvdW50OwoJdTMyIGRldmljZV9jb25uZWN0X3RpbWU7Cgl1MzIgZnVuY3Rpb25fcGVuZGluZ190aW1lOwoJdTMyIGRldmljZV9kaXNjb25uZWN0X3RpbWU7Cgl1MzIgY29udHJvbF91bml0X3F1ZXVpbmdfdGltZTsKCXUzMiBkZXZpY2VfYWN0aXZlX29ubHlfdGltZTsKCXUzMiByZXNlcnZlZFsyXTsKfTsKCi8qIGluc2VydCBhIHNpbmdsZSBkZXZpY2UgaW50byB0aGUgY21iX2FyZWEgbGlzdAogKiBjYWxsZWQgd2l0aCBjbWJfYXJlYS5sb2NrIGhlbGQgZnJvbSBhbGxvY19jbWIKICovCnN0YXRpYyBpbnQgYWxsb2NfY21iX3NpbmdsZShzdHJ1Y3QgY2N3X2RldmljZSAqY2RldiwKCQkJICAgIHN0cnVjdCBjbWJfZGF0YSAqY21iX2RhdGEpCnsKCXN0cnVjdCBjbWIgKmNtYjsKCXN0cnVjdCBjY3dfZGV2aWNlX3ByaXZhdGUgKm5vZGU7CglpbnQgcmV0OwoKCXNwaW5fbG9ja19pcnEoY2Rldi0+Y2N3bG9jayk7CglpZiAoIWxpc3RfZW1wdHkoJmNkZXYtPnByaXZhdGUtPmNtYl9saXN0KSkgewoJCXJldCA9IC1FQlVTWTsKCQlnb3RvIG91dDsKCX0KCgkvKiBmaW5kIGZpcnN0IHVudXNlZCBjbWIgaW4gY21iX2FyZWEubWVtLgoJICogdGhpcyBpcyBhIGxpdHRsZSB0cmlja3k6IGNtYl9hcmVhLmxpc3QKCSAqIHJlbWFpbnMgc29ydGVkIGJ5IC0+Y21iLT5od19kYXRhIHBvaW50ZXJzICovCgljbWIgPSBjbWJfYXJlYS5tZW07CglsaXN0X2Zvcl9lYWNoX2VudHJ5KG5vZGUsICZjbWJfYXJlYS5saXN0LCBjbWJfbGlzdCkgewoJCXN0cnVjdCBjbWJfZGF0YSAqZGF0YTsKCQlkYXRhID0gbm9kZS0+Y21iOwoJCWlmICgoc3RydWN0IGNtYiopZGF0YS0+aHdfYmxvY2sgPiBjbWIpCgkJCWJyZWFrOwoJCWNtYisrOwoJfQoJaWYgKGNtYiAtIGNtYl9hcmVhLm1lbSA+PSBjbWJfYXJlYS5udW1fY2hhbm5lbHMpIHsKCQlyZXQgPSAtRU5PTUVNOwoJCWdvdG8gb3V0OwoJfQoKCS8qIGluc2VydCBuZXcgY21iICovCglsaXN0X2FkZF90YWlsKCZjZGV2LT5wcml2YXRlLT5jbWJfbGlzdCwgJm5vZGUtPmNtYl9saXN0KTsKCWNtYl9kYXRhLT5od19ibG9jayA9IGNtYjsKCWNkZXYtPnByaXZhdGUtPmNtYiA9IGNtYl9kYXRhOwoJcmV0ID0gMDsKb3V0OgoJc3Bpbl91bmxvY2tfaXJxKGNkZXYtPmNjd2xvY2spOwoJcmV0dXJuIHJldDsKfQoKc3RhdGljIGludAphbGxvY19jbWIgKHN0cnVjdCBjY3dfZGV2aWNlICpjZGV2KQp7CglpbnQgcmV0OwoJc3RydWN0IGNtYiAqbWVtOwoJc3NpemVfdCBzaXplOwoJc3RydWN0IGNtYl9kYXRhICpjbWJfZGF0YTsKCgkvKiBBbGxvY2F0ZSBwcml2YXRlIGNtYl9kYXRhLiAqLwoJY21iX2RhdGEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgY21iX2RhdGEpLCBHRlBfS0VSTkVMKTsKCWlmICghY21iX2RhdGEpCgkJcmV0dXJuIC1FTk9NRU07CgoJY21iX2RhdGEtPmxhc3RfYmxvY2sgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgY21iKSwgR0ZQX0tFUk5FTCk7CglpZiAoIWNtYl9kYXRhLT5sYXN0X2Jsb2NrKSB7CgkJa2ZyZWUoY21iX2RhdGEpOwoJCXJldHVybiAtRU5PTUVNOwoJfQoJY21iX2RhdGEtPnNpemUgPSBzaXplb2Yoc3RydWN0IGNtYik7CglzcGluX2xvY2soJmNtYl9hcmVhLmxvY2spOwoKCWlmICghY21iX2FyZWEubWVtKSB7CgkJLyogdGhlcmUgaXMgbm8gdXNlciB5ZXQsIHNvIHdlIG5lZWQgYSBuZXcgYXJlYSAqLwoJCXNpemUgPSBzaXplb2Yoc3RydWN0IGNtYikgKiBjbWJfYXJlYS5udW1fY2hhbm5lbHM7CgkJV0FSTl9PTighbGlzdF9lbXB0eSgmY21iX2FyZWEubGlzdCkpOwoKCQlzcGluX3VubG9jaygmY21iX2FyZWEubG9jayk7CgkJbWVtID0gKHZvaWQqKV9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0tFUk5FTCB8IEdGUF9ETUEsCgkJCQkgZ2V0X29yZGVyKHNpemUpKTsKCQlzcGluX2xvY2soJmNtYl9hcmVhLmxvY2spOwoKCQlpZiAoY21iX2FyZWEubWVtKSB7CgkJCS8qIG9rLCBhbm90aGVyIHRocmVhZCB3YXMgZmFzdGVyICovCgkJCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpbWVtLCBnZXRfb3JkZXIoc2l6ZSkpOwoJCX0gZWxzZSBpZiAoIW1lbSkgewoJCQkvKiBubyBsdWNrICovCgkJCXJldCA9IC1FTk9NRU07CgkJCWdvdG8gb3V0OwoJCX0gZWxzZSB7CgkJCS8qIGV2ZXJ5dGhpbmcgb2sgKi8KCQkJbWVtc2V0KG1lbSwgMCwgc2l6ZSk7CgkJCWNtYl9hcmVhLm1lbSA9IG1lbTsKCQkJY21mX2FjdGl2YXRlKGNtYl9hcmVhLm1lbSwgMSk7CgkJfQoJfQoKCS8qIGRvIHRoZSBhY3R1YWwgYWxsb2NhdGlvbiAqLwoJcmV0ID0gYWxsb2NfY21iX3NpbmdsZShjZGV2LCBjbWJfZGF0YSk7Cm91dDoKCXNwaW5fdW5sb2NrKCZjbWJfYXJlYS5sb2NrKTsKCWlmIChyZXQpIHsKCQlrZnJlZShjbWJfZGF0YS0+bGFzdF9ibG9jayk7CgkJa2ZyZWUoY21iX2RhdGEpOwoJfQoJcmV0dXJuIHJldDsKfQoKc3RhdGljIHZvaWQgZnJlZV9jbWIoc3RydWN0IGNjd19kZXZpY2UgKmNkZXYpCnsKCXN0cnVjdCBjY3dfZGV2aWNlX3ByaXZhdGUgKnByaXY7CglzdHJ1Y3QgY21iX2RhdGEgKmNtYl9kYXRhOwoKCXNwaW5fbG9jaygmY21iX2FyZWEubG9jayk7CglzcGluX2xvY2tfaXJxKGNkZXYtPmNjd2xvY2spOwoKCXByaXYgPSBjZGV2LT5wcml2YXRlOwoKCWlmIChsaXN0X2VtcHR5KCZwcml2LT5jbWJfbGlzdCkpIHsKCQkvKiBhbHJlYWR5IGZyZWVkICovCgkJZ290byBvdXQ7Cgl9CgoJY21iX2RhdGEgPSBwcml2LT5jbWI7Cglwcml2LT5jbWIgPSBOVUxMOwoJaWYgKGNtYl9kYXRhKQoJCWtmcmVlKGNtYl9kYXRhLT5sYXN0X2Jsb2NrKTsKCWtmcmVlKGNtYl9kYXRhKTsKCWxpc3RfZGVsX2luaXQoJnByaXYtPmNtYl9saXN0KTsKCglpZiAobGlzdF9lbXB0eSgmY21iX2FyZWEubGlzdCkpIHsKCQlzc2l6ZV90IHNpemU7CgkJc2l6ZSA9IHNpemVvZihzdHJ1Y3QgY21iKSAqIGNtYl9hcmVhLm51bV9jaGFubmVsczsKCQljbWZfYWN0aXZhdGUoTlVMTCwgMCk7CgkJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZyljbWJfYXJlYS5tZW0sIGdldF9vcmRlcihzaXplKSk7CgkJY21iX2FyZWEubWVtID0gTlVMTDsKCX0Kb3V0OgoJc3Bpbl91bmxvY2tfaXJxKGNkZXYtPmNjd2xvY2spOwoJc3Bpbl91bmxvY2soJmNtYl9hcmVhLmxvY2spOwp9CgpzdGF0aWMgaW50IHNldF9jbWIoc3RydWN0IGNjd19kZXZpY2UgKmNkZXYsIHUzMiBtbWUpCnsKCXUxNiBvZmZzZXQ7CglzdHJ1Y3QgY21iX2RhdGEgKmNtYl9kYXRhOwoJdW5zaWduZWQgbG9uZyBmbGFnczsKCglzcGluX2xvY2tfaXJxc2F2ZShjZGV2LT5jY3dsb2NrLCBmbGFncyk7CglpZiAoIWNkZXYtPnByaXZhdGUtPmNtYikgewoJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoY2Rldi0+Y2N3bG9jaywgZmxhZ3MpOwoJCXJldHVybiAtRUlOVkFMOwoJfQoJY21iX2RhdGEgPSBjZGV2LT5wcml2YXRlLT5jbWI7CglvZmZzZXQgPSBtbWUgPyAoc3RydWN0IGNtYiAqKWNtYl9kYXRhLT5od19ibG9jayAtIGNtYl9hcmVhLm1lbSA6IDA7CglzcGluX3VubG9ja19pcnFyZXN0b3JlKGNkZXYtPmNjd2xvY2ssIGZsYWdzKTsKCglyZXR1cm4gc2V0X3NjaGliX3dhaXQoY2RldiwgbW1lLCAwLCBvZmZzZXQpOwp9CgpzdGF0aWMgdTY0IHJlYWRfY21iIChzdHJ1Y3QgY2N3X2RldmljZSAqY2RldiwgaW50IGluZGV4KQp7CglzdHJ1Y3QgY21iICpjbWI7Cgl1MzIgdmFsOwoJaW50IHJldDsKCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CgoJcmV0ID0gY21mX2NtYl9jb3B5X3dhaXQoY2Rldik7CglpZiAocmV0IDwgMCkKCQlyZXR1cm4gMDsKCglzcGluX2xvY2tfaXJxc2F2ZShjZGV2LT5jY3dsb2NrLCBmbGFncyk7CglpZiAoIWNkZXYtPnByaXZhdGUtPmNtYikgewoJCXJldCA9IDA7CgkJZ290byBvdXQ7Cgl9CgljbWIgPSAoKHN0cnVjdCBjbWJfZGF0YSAqKWNkZXYtPnByaXZhdGUtPmNtYiktPmxhc3RfYmxvY2s7CgoJc3dpdGNoIChpbmRleCkgewoJY2FzZSBjbWJfc3NjaF9yc2NoX2NvdW50OgoJCXJldCA9IGNtYi0+c3NjaF9yc2NoX2NvdW50OwoJCWdvdG8gb3V0OwoJY2FzZSBjbWJfc2FtcGxlX2NvdW50OgoJCXJldCA9IGNtYi0+c2FtcGxlX2NvdW50OwoJCWdvdG8gb3V0OwoJY2FzZSBjbWJfZGV2aWNlX2Nvbm5lY3RfdGltZToKCQl2YWwgPSBjbWItPmRldmljZV9jb25uZWN0X3RpbWU7CgkJYnJlYWs7CgljYXNlIGNtYl9mdW5jdGlvbl9wZW5kaW5nX3RpbWU6CgkJdmFsID0gY21iLT5mdW5jdGlvbl9wZW5kaW5nX3RpbWU7CgkJYnJlYWs7CgljYXNlIGNtYl9kZXZpY2VfZGlzY29ubmVjdF90aW1lOgoJCXZhbCA9IGNtYi0+ZGV2aWNlX2Rpc2Nvbm5lY3RfdGltZTsKCQlicmVhazsKCWNhc2UgY21iX2NvbnRyb2xfdW5pdF9xdWV1aW5nX3RpbWU6CgkJdmFsID0gY21iLT5jb250cm9sX3VuaXRfcXVldWluZ190aW1lOwoJCWJyZWFrOwoJY2FzZSBjbWJfZGV2aWNlX2FjdGl2ZV9vbmx5X3RpbWU6CgkJdmFsID0gY21iLT5kZXZpY2VfYWN0aXZlX29ubHlfdGltZTsKCQlicmVhazsKCWRlZmF1bHQ6CgkJcmV0ID0gMDsKCQlnb3RvIG91dDsKCX0KCXJldCA9IHRpbWVfdG9fYXZnX25zZWModmFsLCBjbWItPnNhbXBsZV9jb3VudCk7Cm91dDoKCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoY2Rldi0+Y2N3bG9jaywgZmxhZ3MpOwoJcmV0dXJuIHJldDsKfQoKc3RhdGljIGludCByZWFkYWxsX2NtYiAoc3RydWN0IGNjd19kZXZpY2UgKmNkZXYsIHN0cnVjdCBjbWJkYXRhICpkYXRhKQp7CglzdHJ1Y3QgY21iICpjbWI7CglzdHJ1Y3QgY21iX2RhdGEgKmNtYl9kYXRhOwoJdTY0IHRpbWU7Cgl1bnNpZ25lZCBsb25nIGZsYWdzOwoJaW50IHJldDsKCglyZXQgPSBjbWZfY21iX2NvcHlfd2FpdChjZGV2KTsKCWlmIChyZXQgPCAwKQoJCXJldHVybiByZXQ7CglzcGluX2xvY2tfaXJxc2F2ZShjZGV2LT5jY3dsb2NrLCBmbGFncyk7CgljbWJfZGF0YSA9IGNkZXYtPnByaXZhdGUtPmNtYjsKCWlmICghY21iX2RhdGEpIHsKCQlyZXQgPSAtRU5PREVWOwoJCWdvdG8gb3V0OwoJfQoJaWYgKGNtYl9kYXRhLT5sYXN0X3VwZGF0ZSA9PSAwKSB7CgkJcmV0ID0gLUVBR0FJTjsKCQlnb3RvIG91dDsKCX0KCWNtYiA9IGNtYl9kYXRhLT5sYXN0X2Jsb2NrOwoJdGltZSA9IGNtYl9kYXRhLT5sYXN0X3VwZGF0ZSAtIGNkZXYtPnByaXZhdGUtPmNtYl9zdGFydF90aW1lOwoKCW1lbXNldChkYXRhLCAwLCBzaXplb2Yoc3RydWN0IGNtYmRhdGEpKTsKCgkvKiB3ZSBvbmx5IGtub3cgdmFsdWVzIGJlZm9yZSBkZXZpY2VfYnVzeV90aW1lICovCglkYXRhLT5zaXplID0gb2Zmc2V0b2Yoc3RydWN0IGNtYmRhdGEsIGRldmljZV9idXN5X3RpbWUpOwoKCS8qIGNvbnZlcnQgdG8gbmFub3NlY29uZHMgKi8KCWRhdGEtPmVsYXBzZWRfdGltZSA9ICh0aW1lICogMTAwMCkgPj4gMTI7CgoJLyogY29weSBkYXRhIHRvIG5ldyBzdHJ1Y3R1cmUgKi8KCWRhdGEtPnNzY2hfcnNjaF9jb3VudCA9IGNtYi0+c3NjaF9yc2NoX2NvdW50OwoJZGF0YS0+c2FtcGxlX2NvdW50ID0gY21iLT5zYW1wbGVfY291bnQ7CgoJLyogdGltZSBmaWVsZHMgYXJlIGNvbnZlcnRlZCB0byBuYW5vc2Vjb25kcyB3aGlsZSBjb3B5aW5nICovCglkYXRhLT5kZXZpY2VfY29ubmVjdF90aW1lID0gdGltZV90b19uc2VjKGNtYi0+ZGV2aWNlX2Nvbm5lY3RfdGltZSk7CglkYXRhLT5mdW5jdGlvbl9wZW5kaW5nX3RpbWUgPSB0aW1lX3RvX25zZWMoY21iLT5mdW5jdGlvbl9wZW5kaW5nX3RpbWUpOwoJZGF0YS0+ZGV2aWNlX2Rpc2Nvbm5lY3RfdGltZSA9CgkJdGltZV90b19uc2VjKGNtYi0+ZGV2aWNlX2Rpc2Nvbm5lY3RfdGltZSk7CglkYXRhLT5jb250cm9sX3VuaXRfcXVldWluZ190aW1lCgkJPSB0aW1lX3RvX25zZWMoY21iLT5jb250cm9sX3VuaXRfcXVldWluZ190aW1lKTsKCWRhdGEtPmRldmljZV9hY3RpdmVfb25seV90aW1lCgkJPSB0aW1lX3RvX25zZWMoY21iLT5kZXZpY2VfYWN0aXZlX29ubHlfdGltZSk7CglyZXQgPSAwOwpvdXQ6CglzcGluX3VubG9ja19pcnFyZXN0b3JlKGNkZXYtPmNjd2xvY2ssIGZsYWdzKTsKCXJldHVybiByZXQ7Cn0KCnN0YXRpYyB2b2lkIHJlc2V0X2NtYihzdHJ1Y3QgY2N3X2RldmljZSAqY2RldikKewoJY21mX2dlbmVyaWNfcmVzZXQoY2Rldik7Cn0KCnN0YXRpYyB2b2lkICogYWxpZ25fY21iKHZvaWQgKmFyZWEpCnsKCXJldHVybiBhcmVhOwp9CgpzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBjbWZfYXR0cl9ncm91cDsKCnN0YXRpYyBzdHJ1Y3QgY21iX29wZXJhdGlvbnMgY21ib3BzX2Jhc2ljID0gewoJLmFsbG9jCT0gYWxsb2NfY21iLAoJLmZyZWUJPSBmcmVlX2NtYiwKCS5zZXQJPSBzZXRfY21iLAoJLnJlYWQJPSByZWFkX2NtYiwKCS5yZWFkYWxsICAgID0gcmVhZGFsbF9jbWIsCgkucmVzZXQJICAgID0gcmVzZXRfY21iLAoJLmFsaWduCSAgICA9IGFsaWduX2NtYiwKCS5hdHRyX2dyb3VwID0gJmNtZl9hdHRyX2dyb3VwLAp9OwoMCi8qICoqKioqKioqIGV4dGVuZGVkIGNtYiBoYW5kbGluZyAqKioqKioqKi8KCi8qKgogKiBzdHJ1Y3QgY21iZSAtIGV4dGVuZGVkIGNoYW5uZWwgbWVhc3VyZW1lbnQgYmxvY2sKICoKICogY21iIGFzIHVzZWQgYnkgdGhlIGhhcmR3YXJlLCBtYXkgYmUgaW4gYW55IDY0IGJpdCBwaHlzaWNhbCBsb2NhdGlvbiwKICogdGhlIGZpZWxkcyBhcmUgZGVzY3JpYmVkIGluIHovQXJjaGl0ZWN0dXJlIFByaW5jaXBsZXMgb2YgT3BlcmF0aW9uLAogKiB0aGlyZCBlZGl0aW9uLCBjaGFwdGVyIDE3LgogKi8Kc3RydWN0IGNtYmUgewoJdTMyIHNzY2hfcnNjaF9jb3VudDsKCXUzMiBzYW1wbGVfY291bnQ7Cgl1MzIgZGV2aWNlX2Nvbm5lY3RfdGltZTsKCXUzMiBmdW5jdGlvbl9wZW5kaW5nX3RpbWU7Cgl1MzIgZGV2aWNlX2Rpc2Nvbm5lY3RfdGltZTsKCXUzMiBjb250cm9sX3VuaXRfcXVldWluZ190aW1lOwoJdTMyIGRldmljZV9hY3RpdmVfb25seV90aW1lOwoJdTMyIGRldmljZV9idXN5X3RpbWU7Cgl1MzIgaW5pdGlhbF9jb21tYW5kX3Jlc3BvbnNlX3RpbWU7Cgl1MzIgcmVzZXJ2ZWRbN107Cn07CgovKiBrbWFsbG9jIG9ubHkgZ3VhcmFudGVlcyA4IGJ5dGUgYWxpZ25tZW50LCBidXQgd2UgbmVlZCBjbWJlCiAqIHBvaW50ZXJzIHRvIGJlIG5hdHVyYWxseSBhbGlnbmVkLiBNYWtlIHN1cmUgdG8gYWxsb2NhdGUKICogZW5vdWdoIHNwYWNlIGZvciB0d28gY21iZXMgKi8Kc3RhdGljIGlubGluZSBzdHJ1Y3QgY21iZSogY21iZV9hbGlnbihzdHJ1Y3QgY21iZSAqYykKewoJdW5zaWduZWQgbG9uZyBhZGRyOwoJYWRkciA9ICgodW5zaWduZWQgbG9uZyljICsgc2l6ZW9mIChzdHJ1Y3QgY21iZSkgLSBzaXplb2YobG9uZykpICYKCQkJCSB+KHNpemVvZiAoc3RydWN0IGNtYmUpIC0gc2l6ZW9mKGxvbmcpKTsKCXJldHVybiAoc3RydWN0IGNtYmUqKWFkZHI7Cn0KCnN0YXRpYyBpbnQgYWxsb2NfY21iZSAoc3RydWN0IGNjd19kZXZpY2UgKmNkZXYpCnsKCXN0cnVjdCBjbWJlICpjbWJlOwoJc3RydWN0IGNtYl9kYXRhICpjbWJfZGF0YTsKCWludCByZXQ7CgoJY21iZSA9IGt6YWxsb2MgKHNpemVvZiAoKmNtYmUpICogMiwgR0ZQX0tFUk5FTCk7CglpZiAoIWNtYmUpCgkJcmV0dXJuIC1FTk9NRU07CgljbWJfZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjbWJfZGF0YSksIEdGUF9LRVJORUwpOwoJaWYgKCFjbWJfZGF0YSkgewoJCXJldCA9IC1FTk9NRU07CgkJZ290byBvdXRfZnJlZTsKCX0KCWNtYl9kYXRhLT5sYXN0X2Jsb2NrID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGNtYmUpLCBHRlBfS0VSTkVMKTsKCWlmICghY21iX2RhdGEtPmxhc3RfYmxvY2spIHsKCQlyZXQgPSAtRU5PTUVNOwoJCWdvdG8gb3V0X2ZyZWU7Cgl9CgljbWJfZGF0YS0+c2l6ZSA9IHNpemVvZihzdHJ1Y3QgY21iZSk7CglzcGluX2xvY2tfaXJxKGNkZXYtPmNjd2xvY2spOwoJaWYgKGNkZXYtPnByaXZhdGUtPmNtYikgewoJCXNwaW5fdW5sb2NrX2lycShjZGV2LT5jY3dsb2NrKTsKCQlyZXQgPSAtRUJVU1k7CgkJZ290byBvdXRfZnJlZTsKCX0KCWNtYl9kYXRhLT5od19ibG9jayA9IGNtYmU7CgljZGV2LT5wcml2YXRlLT5jbWIgPSBjbWJfZGF0YTsKCXNwaW5fdW5sb2NrX2lycShjZGV2LT5jY3dsb2NrKTsKCgkvKiBhY3RpdmF0ZSBnbG9iYWwgbWVhc3VyZW1lbnQgaWYgdGhpcyBpcyB0aGUgZmlyc3QgY2hhbm5lbCAqLwoJc3Bpbl9sb2NrKCZjbWJfYXJlYS5sb2NrKTsKCWlmIChsaXN0X2VtcHR5KCZjbWJfYXJlYS5saXN0KSkKCQljbWZfYWN0aXZhdGUoTlVMTCwgMSk7CglsaXN0X2FkZF90YWlsKCZjZGV2LT5wcml2YXRlLT5jbWJfbGlzdCwgJmNtYl9hcmVhLmxpc3QpOwoJc3Bpbl91bmxvY2soJmNtYl9hcmVhLmxvY2spOwoKCXJldHVybiAwOwpvdXRfZnJlZToKCWlmIChjbWJfZGF0YSkKCQlrZnJlZShjbWJfZGF0YS0+bGFzdF9ibG9jayk7CglrZnJlZShjbWJfZGF0YSk7CglrZnJlZShjbWJlKTsKCXJldHVybiByZXQ7Cn0KCnN0YXRpYyB2b2lkIGZyZWVfY21iZSAoc3RydWN0IGNjd19kZXZpY2UgKmNkZXYpCnsKCXN0cnVjdCBjbWJfZGF0YSAqY21iX2RhdGE7CgoJc3Bpbl9sb2NrX2lycShjZGV2LT5jY3dsb2NrKTsKCWNtYl9kYXRhID0gY2Rldi0+cHJpdmF0ZS0+Y21iOwoJY2Rldi0+cHJpdmF0ZS0+Y21iID0gTlVMTDsKCWlmIChjbWJfZGF0YSkKCQlrZnJlZShjbWJfZGF0YS0+bGFzdF9ibG9jayk7CglrZnJlZShjbWJfZGF0YSk7CglzcGluX3VubG9ja19pcnEoY2Rldi0+Y2N3bG9jayk7CgoJLyogZGVhY3RpdmF0ZSBnbG9iYWwgbWVhc3VyZW1lbnQgaWYgdGhpcyBpcyB0aGUgbGFzdCBjaGFubmVsICovCglzcGluX2xvY2soJmNtYl9hcmVhLmxvY2spOwoJbGlzdF9kZWxfaW5pdCgmY2Rldi0+cHJpdmF0ZS0+Y21iX2xpc3QpOwoJaWYgKGxpc3RfZW1wdHkoJmNtYl9hcmVhLmxpc3QpKQoJCWNtZl9hY3RpdmF0ZShOVUxMLCAwKTsKCXNwaW5fdW5sb2NrKCZjbWJfYXJlYS5sb2NrKTsKfQoKc3RhdGljIGludCBzZXRfY21iZShzdHJ1Y3QgY2N3X2RldmljZSAqY2RldiwgdTMyIG1tZSkKewoJdW5zaWduZWQgbG9uZyBtYmE7CglzdHJ1Y3QgY21iX2RhdGEgKmNtYl9kYXRhOwoJdW5zaWduZWQgbG9uZyBmbGFnczsKCglzcGluX2xvY2tfaXJxc2F2ZShjZGV2LT5jY3dsb2NrLCBmbGFncyk7CglpZiAoIWNkZXYtPnByaXZhdGUtPmNtYikgewoJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoY2Rldi0+Y2N3bG9jaywgZmxhZ3MpOwoJCXJldHVybiAtRUlOVkFMOwoJfQoJY21iX2RhdGEgPSBjZGV2LT5wcml2YXRlLT5jbWI7CgltYmEgPSBtbWUgPyAodW5zaWduZWQgbG9uZykgY21iZV9hbGlnbihjbWJfZGF0YS0+aHdfYmxvY2spIDogMDsKCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoY2Rldi0+Y2N3bG9jaywgZmxhZ3MpOwoKCXJldHVybiBzZXRfc2NoaWJfd2FpdChjZGV2LCBtbWUsIDEsIG1iYSk7Cn0KCgpzdGF0aWMgdTY0IHJlYWRfY21iZSAoc3RydWN0IGNjd19kZXZpY2UgKmNkZXYsIGludCBpbmRleCkKewoJc3RydWN0IGNtYmUgKmNtYjsKCXN0cnVjdCBjbWJfZGF0YSAqY21iX2RhdGE7Cgl1MzIgdmFsOwoJaW50IHJldDsKCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CgoJcmV0ID0gY21mX2NtYl9jb3B5X3dhaXQoY2Rldik7CglpZiAocmV0IDwgMCkKCQlyZXR1cm4gMDsKCglzcGluX2xvY2tfaXJxc2F2ZShjZGV2LT5jY3dsb2NrLCBmbGFncyk7CgljbWJfZGF0YSA9IGNkZXYtPnByaXZhdGUtPmNtYjsKCWlmICghY21iX2RhdGEpIHsKCQlyZXQgPSAwOwoJCWdvdG8gb3V0OwoJfQoJY21iID0gY21iX2RhdGEtPmxhc3RfYmxvY2s7CgoJc3dpdGNoIChpbmRleCkgewoJY2FzZSBjbWJfc3NjaF9yc2NoX2NvdW50OgoJCXJldCA9IGNtYi0+c3NjaF9yc2NoX2NvdW50OwoJCWdvdG8gb3V0OwoJY2FzZSBjbWJfc2FtcGxlX2NvdW50OgoJCXJldCA9IGNtYi0+c2FtcGxlX2NvdW50OwoJCWdvdG8gb3V0OwoJY2FzZSBjbWJfZGV2aWNlX2Nvbm5lY3RfdGltZToKCQl2YWwgPSBjbWItPmRldmljZV9jb25uZWN0X3RpbWU7CgkJYnJlYWs7CgljYXNlIGNtYl9mdW5jdGlvbl9wZW5kaW5nX3RpbWU6CgkJdmFsID0gY21iLT5mdW5jdGlvbl9wZW5kaW5nX3RpbWU7CgkJYnJlYWs7CgljYXNlIGNtYl9kZXZpY2VfZGlzY29ubmVjdF90aW1lOgoJCXZhbCA9IGNtYi0+ZGV2aWNlX2Rpc2Nvbm5lY3RfdGltZTsKCQlicmVhazsKCWNhc2UgY21iX2NvbnRyb2xfdW5pdF9xdWV1aW5nX3RpbWU6CgkJdmFsID0gY21iLT5jb250cm9sX3VuaXRfcXVldWluZ190aW1lOwoJCWJyZWFrOwoJY2FzZSBjbWJfZGV2aWNlX2FjdGl2ZV9vbmx5X3RpbWU6CgkJdmFsID0gY21iLT5kZXZpY2VfYWN0aXZlX29ubHlfdGltZTsKCQlicmVhazsKCWNhc2UgY21iX2RldmljZV9idXN5X3RpbWU6CgkJdmFsID0gY21iLT5kZXZpY2VfYnVzeV90aW1lOwoJCWJyZWFrOwoJY2FzZSBjbWJfaW5pdGlhbF9jb21tYW5kX3Jlc3BvbnNlX3RpbWU6CgkJdmFsID0gY21iLT5pbml0aWFsX2NvbW1hbmRfcmVzcG9uc2VfdGltZTsKCQlicmVhazsKCWRlZmF1bHQ6CgkJcmV0ID0gMDsKCQlnb3RvIG91dDsKCX0KCXJldCA9IHRpbWVfdG9fYXZnX25zZWModmFsLCBjbWItPnNhbXBsZV9jb3VudCk7Cm91dDoKCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoY2Rldi0+Y2N3bG9jaywgZmxhZ3MpOwoJcmV0dXJuIHJldDsKfQoKc3RhdGljIGludCByZWFkYWxsX2NtYmUgKHN0cnVjdCBjY3dfZGV2aWNlICpjZGV2LCBzdHJ1Y3QgY21iZGF0YSAqZGF0YSkKewoJc3RydWN0IGNtYmUgKmNtYjsKCXN0cnVjdCBjbWJfZGF0YSAqY21iX2RhdGE7Cgl1NjQgdGltZTsKCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CglpbnQgcmV0OwoKCXJldCA9IGNtZl9jbWJfY29weV93YWl0KGNkZXYpOwoJaWYgKHJldCA8IDApCgkJcmV0dXJuIHJldDsKCXNwaW5fbG9ja19pcnFzYXZlKGNkZXYtPmNjd2xvY2ssIGZsYWdzKTsKCWNtYl9kYXRhID0gY2Rldi0+cHJpdmF0ZS0+Y21iOwoJaWYgKCFjbWJfZGF0YSkgewoJCXJldCA9IC1FTk9ERVY7CgkJZ290byBvdXQ7Cgl9CglpZiAoY21iX2RhdGEtPmxhc3RfdXBkYXRlID09IDApIHsKCQlyZXQgPSAtRUFHQUlOOwoJCWdvdG8gb3V0OwoJfQoJdGltZSA9IGNtYl9kYXRhLT5sYXN0X3VwZGF0ZSAtIGNkZXYtPnByaXZhdGUtPmNtYl9zdGFydF90aW1lOwoKCW1lbXNldCAoZGF0YSwgMCwgc2l6ZW9mKHN0cnVjdCBjbWJkYXRhKSk7CgoJLyogd2Ugb25seSBrbm93IHZhbHVlcyBiZWZvcmUgZGV2aWNlX2J1c3lfdGltZSAqLwoJZGF0YS0+c2l6ZSA9IG9mZnNldG9mKHN0cnVjdCBjbWJkYXRhLCBkZXZpY2VfYnVzeV90aW1lKTsKCgkvKiBjb252ZXIgdG8gbmFub3NlY29uZHMgKi8KCWRhdGEtPmVsYXBzZWRfdGltZSA9ICh0aW1lICogMTAwMCkgPj4gMTI7CgoJY21iID0gY21iX2RhdGEtPmxhc3RfYmxvY2s7CgkvKiBjb3B5IGRhdGEgdG8gbmV3IHN0cnVjdHVyZSAqLwoJZGF0YS0+c3NjaF9yc2NoX2NvdW50ID0gY21iLT5zc2NoX3JzY2hfY291bnQ7CglkYXRhLT5zYW1wbGVfY291bnQgPSBjbWItPnNhbXBsZV9jb3VudDsKCgkvKiB0aW1lIGZpZWxkcyBhcmUgY29udmVydGVkIHRvIG5hbm9zZWNvbmRzIHdoaWxlIGNvcHlpbmcgKi8KCWRhdGEtPmRldmljZV9jb25uZWN0X3RpbWUgPSB0aW1lX3RvX25zZWMoY21iLT5kZXZpY2VfY29ubmVjdF90aW1lKTsKCWRhdGEtPmZ1bmN0aW9uX3BlbmRpbmdfdGltZSA9IHRpbWVfdG9fbnNlYyhjbWItPmZ1bmN0aW9uX3BlbmRpbmdfdGltZSk7CglkYXRhLT5kZXZpY2VfZGlzY29ubmVjdF90aW1lID0KCQl0aW1lX3RvX25zZWMoY21iLT5kZXZpY2VfZGlzY29ubmVjdF90aW1lKTsKCWRhdGEtPmNvbnRyb2xfdW5pdF9xdWV1aW5nX3RpbWUKCQk9IHRpbWVfdG9fbnNlYyhjbWItPmNvbnRyb2xfdW5pdF9xdWV1aW5nX3RpbWUpOwoJZGF0YS0+ZGV2aWNlX2FjdGl2ZV9vbmx5X3RpbWUKCQk9IHRpbWVfdG9fbnNlYyhjbWItPmRldmljZV9hY3RpdmVfb25seV90aW1lKTsKCWRhdGEtPmRldmljZV9idXN5X3RpbWUgPSB0aW1lX3RvX25zZWMoY21iLT5kZXZpY2VfYnVzeV90aW1lKTsKCWRhdGEtPmluaXRpYWxfY29tbWFuZF9yZXNwb25zZV90aW1lCgkJPSB0aW1lX3RvX25zZWMoY21iLT5pbml0aWFsX2NvbW1hbmRfcmVzcG9uc2VfdGltZSk7CgoJcmV0ID0gMDsKb3V0OgoJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShjZGV2LT5jY3dsb2NrLCBmbGFncyk7CglyZXR1cm4gcmV0Owp9CgpzdGF0aWMgdm9pZCByZXNldF9jbWJlKHN0cnVjdCBjY3dfZGV2aWNlICpjZGV2KQp7CgljbWZfZ2VuZXJpY19yZXNldChjZGV2KTsKfQoKc3RhdGljIHZvaWQgKiBhbGlnbl9jbWJlKHZvaWQgKmFyZWEpCnsKCXJldHVybiBjbWJlX2FsaWduKGFyZWEpOwp9CgpzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBjbWZfYXR0cl9ncm91cF9leHQ7CgpzdGF0aWMgc3RydWN0IGNtYl9vcGVyYXRpb25zIGNtYm9wc19leHRlbmRlZCA9IHsKCS5hbGxvYwkgICAgPSBhbGxvY19jbWJlLAoJLmZyZWUJICAgID0gZnJlZV9jbWJlLAoJLnNldAkgICAgPSBzZXRfY21iZSwKCS5yZWFkCSAgICA9IHJlYWRfY21iZSwKCS5yZWFkYWxsICAgID0gcmVhZGFsbF9jbWJlLAoJLnJlc2V0CSAgICA9IHJlc2V0X2NtYmUsCgkuYWxpZ24JICAgID0gYWxpZ25fY21iZSwKCS5hdHRyX2dyb3VwID0gJmNtZl9hdHRyX2dyb3VwX2V4dCwKfTsKDAoKc3RhdGljIHNzaXplX3QKY21iX3Nob3dfYXR0cihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgZW51bSBjbWJfaW5kZXggaWR4KQp7CglyZXR1cm4gc3ByaW50ZihidWYsICIlbGxkXG4iLAoJCSh1bnNpZ25lZCBsb25nIGxvbmcpIGNtZl9yZWFkKHRvX2Njd2RldihkZXYpLCBpZHgpKTsKfQoKc3RhdGljIHNzaXplX3QKY21iX3Nob3dfYXZnX3NhbXBsZV9pbnRlcnZhbChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCnsKCXN0cnVjdCBjY3dfZGV2aWNlICpjZGV2OwoJbG9uZyBpbnRlcnZhbDsKCXVuc2lnbmVkIGxvbmcgY291bnQ7CglzdHJ1Y3QgY21iX2RhdGEgKmNtYl9kYXRhOwoKCWNkZXYgPSB0b19jY3dkZXYoZGV2KTsKCWNvdW50ID0gY21mX3JlYWQoY2RldiwgY21iX3NhbXBsZV9jb3VudCk7CglzcGluX2xvY2tfaXJxKGNkZXYtPmNjd2xvY2spOwoJY21iX2RhdGEgPSBjZGV2LT5wcml2YXRlLT5jbWI7CglpZiAoY291bnQpIHsKCQlpbnRlcnZhbCA9IGNtYl9kYXRhLT5sYXN0X3VwZGF0ZSAtCgkJCWNkZXYtPnByaXZhdGUtPmNtYl9zdGFydF90aW1lOwoJCWludGVydmFsID0gKGludGVydmFsICogMTAwMCkgPj4gMTI7CgkJaW50ZXJ2YWwgLz0gY291bnQ7Cgl9IGVsc2UKCQlpbnRlcnZhbCA9IC0xOwoJc3Bpbl91bmxvY2tfaXJxKGNkZXYtPmNjd2xvY2spOwoJcmV0dXJuIHNwcmludGYoYnVmLCAiJWxkXG4iLCBpbnRlcnZhbCk7Cn0KCnN0YXRpYyBzc2l6ZV90CmNtYl9zaG93X2F2Z191dGlsaXphdGlvbihzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCnsKCXN0cnVjdCBjbWJkYXRhIGRhdGE7Cgl1NjQgdXRpbGl6YXRpb247Cgl1bnNpZ25lZCBsb25nIHQsIHU7CglpbnQgcmV0OwoKCXJldCA9IGNtZl9yZWFkYWxsKHRvX2Njd2RldihkZXYpLCAmZGF0YSk7CglpZiAocmV0ID09IC1FQUdBSU4gfHwgcmV0ID09IC1FTk9ERVYpCgkJLyogTm8gZGF0YSAoeWV0L2N1cnJlbnRseSkgYXZhaWxhYmxlIHRvIHVzZSBmb3IgY2FsY3VsYXRpb24uICovCgkJcmV0dXJuIHNwcmludGYoYnVmLCAibi9hXG4iKTsKCWVsc2UgaWYgKHJldCkKCQlyZXR1cm4gcmV0OwoKCXV0aWxpemF0aW9uID0gZGF0YS5kZXZpY2VfY29ubmVjdF90aW1lICsKCQkgICAgICBkYXRhLmZ1bmN0aW9uX3BlbmRpbmdfdGltZSArCgkJICAgICAgZGF0YS5kZXZpY2VfZGlzY29ubmVjdF90aW1lOwoKCS8qIHNoaWZ0IHRvIGF2b2lkIGxvbmcgbG9uZyBkaXZpc2lvbiAqLwoJd2hpbGUgKC0xdWwgPCAoZGF0YS5lbGFwc2VkX3RpbWUgfCB1dGlsaXphdGlvbikpIHsKCQl1dGlsaXphdGlvbiA+Pj0gODsKCQlkYXRhLmVsYXBzZWRfdGltZSA+Pj0gODsKCX0KCgkvKiBjYWxjdWxhdGUgdmFsdWUgaW4gMC4xIHBlcmNlbnQgdW5pdHMgKi8KCXQgPSAodW5zaWduZWQgbG9uZykgZGF0YS5lbGFwc2VkX3RpbWUgLyAxMDAwOwoJdSA9ICh1bnNpZ25lZCBsb25nKSB1dGlsaXphdGlvbiAvIHQ7CgoJcmV0dXJuIHNwcmludGYoYnVmLCAiJTAybGQuJTAxbGQlJVxuIiwgdS8gMTAsIHUgLSAodS8gMTApICogMTApOwp9CgojZGVmaW5lIGNtZl9hdHRyKG5hbWUpIFwKc3RhdGljIHNzaXplX3Qgc2hvd18gIyMgbmFtZSAoc3RydWN0IGRldmljZSAqIGRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKiBidWYpIFwKeyByZXR1cm4gY21iX3Nob3dfYXR0cigoZGV2KSwgYnVmLCBjbWJfICMjIG5hbWUpOyB9IFwKc3RhdGljIERFVklDRV9BVFRSKG5hbWUsIDA0NDQsIHNob3dfICMjIG5hbWUsIE5VTEwpOwoKI2RlZmluZSBjbWZfYXR0cl9hdmcobmFtZSkgXApzdGF0aWMgc3NpemVfdCBzaG93X2F2Z18gIyMgbmFtZSAoc3RydWN0IGRldmljZSAqIGRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKiBidWYpIFwKeyByZXR1cm4gY21iX3Nob3dfYXR0cigoZGV2KSwgYnVmLCBjbWJfICMjIG5hbWUpOyB9IFwKc3RhdGljIERFVklDRV9BVFRSKGF2Z18gIyMgbmFtZSwgMDQ0NCwgc2hvd19hdmdfICMjIG5hbWUsIE5VTEwpOwoKY21mX2F0dHIoc3NjaF9yc2NoX2NvdW50KTsKY21mX2F0dHIoc2FtcGxlX2NvdW50KTsKY21mX2F0dHJfYXZnKGRldmljZV9jb25uZWN0X3RpbWUpOwpjbWZfYXR0cl9hdmcoZnVuY3Rpb25fcGVuZGluZ190aW1lKTsKY21mX2F0dHJfYXZnKGRldmljZV9kaXNjb25uZWN0X3RpbWUpOwpjbWZfYXR0cl9hdmcoY29udHJvbF91bml0X3F1ZXVpbmdfdGltZSk7CmNtZl9hdHRyX2F2ZyhkZXZpY2VfYWN0aXZlX29ubHlfdGltZSk7CmNtZl9hdHRyX2F2ZyhkZXZpY2VfYnVzeV90aW1lKTsKY21mX2F0dHJfYXZnKGluaXRpYWxfY29tbWFuZF9yZXNwb25zZV90aW1lKTsKCnN0YXRpYyBERVZJQ0VfQVRUUihhdmdfc2FtcGxlX2ludGVydmFsLCAwNDQ0LCBjbWJfc2hvd19hdmdfc2FtcGxlX2ludGVydmFsLCBOVUxMKTsKc3RhdGljIERFVklDRV9BVFRSKGF2Z191dGlsaXphdGlvbiwgMDQ0NCwgY21iX3Nob3dfYXZnX3V0aWxpemF0aW9uLCBOVUxMKTsKCnN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpjbWZfYXR0cmlidXRlc1tdID0gewoJJmRldl9hdHRyX2F2Z19zYW1wbGVfaW50ZXJ2YWwuYXR0ciwKCSZkZXZfYXR0cl9hdmdfdXRpbGl6YXRpb24uYXR0ciwKCSZkZXZfYXR0cl9zc2NoX3JzY2hfY291bnQuYXR0ciwKCSZkZXZfYXR0cl9zYW1wbGVfY291bnQuYXR0ciwKCSZkZXZfYXR0cl9hdmdfZGV2aWNlX2Nvbm5lY3RfdGltZS5hdHRyLAoJJmRldl9hdHRyX2F2Z19mdW5jdGlvbl9wZW5kaW5nX3RpbWUuYXR0ciwKCSZkZXZfYXR0cl9hdmdfZGV2aWNlX2Rpc2Nvbm5lY3RfdGltZS5hdHRyLAoJJmRldl9hdHRyX2F2Z19jb250cm9sX3VuaXRfcXVldWluZ190aW1lLmF0dHIsCgkmZGV2X2F0dHJfYXZnX2RldmljZV9hY3RpdmVfb25seV90aW1lLmF0dHIsCglOVUxMLAp9OwoKc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgY21mX2F0dHJfZ3JvdXAgPSB7CgkubmFtZSAgPSAiY21mIiwKCS5hdHRycyA9IGNtZl9hdHRyaWJ1dGVzLAp9OwoKc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmNtZl9hdHRyaWJ1dGVzX2V4dFtdID0gewoJJmRldl9hdHRyX2F2Z19zYW1wbGVfaW50ZXJ2YWwuYXR0ciwKCSZkZXZfYXR0cl9hdmdfdXRpbGl6YXRpb24uYXR0ciwKCSZkZXZfYXR0cl9zc2NoX3JzY2hfY291bnQuYXR0ciwKCSZkZXZfYXR0cl9zYW1wbGVfY291bnQuYXR0ciwKCSZkZXZfYXR0cl9hdmdfZGV2aWNlX2Nvbm5lY3RfdGltZS5hdHRyLAoJJmRldl9hdHRyX2F2Z19mdW5jdGlvbl9wZW5kaW5nX3RpbWUuYXR0ciwKCSZkZXZfYXR0cl9hdmdfZGV2aWNlX2Rpc2Nvbm5lY3RfdGltZS5hdHRyLAoJJmRldl9hdHRyX2F2Z19jb250cm9sX3VuaXRfcXVldWluZ190aW1lLmF0dHIsCgkmZGV2X2F0dHJfYXZnX2RldmljZV9hY3RpdmVfb25seV90aW1lLmF0dHIsCgkmZGV2X2F0dHJfYXZnX2RldmljZV9idXN5X3RpbWUuYXR0ciwKCSZkZXZfYXR0cl9hdmdfaW5pdGlhbF9jb21tYW5kX3Jlc3BvbnNlX3RpbWUuYXR0ciwKCU5VTEwsCn07CgpzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBjbWZfYXR0cl9ncm91cF9leHQgPSB7CgkubmFtZSAgPSAiY21mIiwKCS5hdHRycyA9IGNtZl9hdHRyaWJ1dGVzX2V4dCwKfTsKCnN0YXRpYyBzc2l6ZV90IGNtYl9lbmFibGVfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCnsKCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB0b19jY3dkZXYoZGV2KS0+cHJpdmF0ZS0+Y21iID8gMSA6IDApOwp9CgpzdGF0aWMgc3NpemVfdCBjbWJfZW5hYmxlX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGMpCnsKCXN0cnVjdCBjY3dfZGV2aWNlICpjZGV2OwoJaW50IHJldDsKCgljZGV2ID0gdG9fY2N3ZGV2KGRldik7CgoJc3dpdGNoIChidWZbMF0pIHsKCWNhc2UgJzAnOgoJCXJldCA9IGRpc2FibGVfY21mKGNkZXYpOwoJCWlmIChyZXQpCgkJCXByaW50ayhLRVJOX0lORk8gImRpc2FibGVfY21mIGZhaWxlZCAoJWQpXG4iLCByZXQpOwoJCWJyZWFrOwoJY2FzZSAnMSc6CgkJcmV0ID0gZW5hYmxlX2NtZihjZGV2KTsKCQlpZiAocmV0ICYmIHJldCAhPSAtRUJVU1kpCgkJCXByaW50ayhLRVJOX0lORk8gImVuYWJsZV9jbWYgZmFpbGVkICglZClcbiIsIHJldCk7CgkJYnJlYWs7Cgl9CgoJcmV0dXJuIGM7Cn0KCkRFVklDRV9BVFRSKGNtYl9lbmFibGUsIDA2NDQsIGNtYl9lbmFibGVfc2hvdywgY21iX2VuYWJsZV9zdG9yZSk7CgovKiBlbmFibGVfY21mL2Rpc2FibGVfY21mOiBtb2R1bGUgaW50ZXJmYWNlIGZvciBjbWYgKGRlKWFjdGl2YXRpb24gKi8KaW50CmVuYWJsZV9jbWYoc3RydWN0IGNjd19kZXZpY2UgKmNkZXYpCnsKCWludCByZXQ7CgoJcmV0ID0gY21ib3BzLT5hbGxvYyhjZGV2KTsKCWNtYm9wcy0+cmVzZXQoY2Rldik7CglpZiAocmV0KQoJCXJldHVybiByZXQ7CglyZXQgPSBjbWJvcHMtPnNldChjZGV2LCAyKTsKCWlmIChyZXQpIHsKCQljbWJvcHMtPmZyZWUoY2Rldik7CgkJcmV0dXJuIHJldDsKCX0KCXJldCA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmY2Rldi0+ZGV2LmtvYmosIGNtYm9wcy0+YXR0cl9ncm91cCk7CglpZiAoIXJldCkKCQlyZXR1cm4gMDsKCWNtYm9wcy0+c2V0KGNkZXYsIDApOyAgLy9GSVhNRTogdGhpcyBjYW4gZmFpbAoJY21ib3BzLT5mcmVlKGNkZXYpOwoJcmV0dXJuIHJldDsKfQoKaW50CmRpc2FibGVfY21mKHN0cnVjdCBjY3dfZGV2aWNlICpjZGV2KQp7CglpbnQgcmV0OwoKCXJldCA9IGNtYm9wcy0+c2V0KGNkZXYsIDApOwoJaWYgKHJldCkKCQlyZXR1cm4gcmV0OwoJY21ib3BzLT5mcmVlKGNkZXYpOwoJc3lzZnNfcmVtb3ZlX2dyb3VwKCZjZGV2LT5kZXYua29iaiwgY21ib3BzLT5hdHRyX2dyb3VwKTsKCXJldHVybiByZXQ7Cn0KCnU2NApjbWZfcmVhZChzdHJ1Y3QgY2N3X2RldmljZSAqY2RldiwgaW50IGluZGV4KQp7CglyZXR1cm4gY21ib3BzLT5yZWFkKGNkZXYsIGluZGV4KTsKfQoKaW50CmNtZl9yZWFkYWxsKHN0cnVjdCBjY3dfZGV2aWNlICpjZGV2LCBzdHJ1Y3QgY21iZGF0YSAqZGF0YSkKewoJcmV0dXJuIGNtYm9wcy0+cmVhZGFsbChjZGV2LCBkYXRhKTsKfQoKLyogUmVlbmFibGUgY21mIHdoZW4gYSBkaXNjb25uZWN0ZWQgZGV2aWNlIGJlY29tZXMgYXZhaWxhYmxlIGFnYWluLiAqLwppbnQgY21mX3JlZW5hYmxlKHN0cnVjdCBjY3dfZGV2aWNlICpjZGV2KQp7CgljbWJvcHMtPnJlc2V0KGNkZXYpOwoJcmV0dXJuIGNtYm9wcy0+c2V0KGNkZXYsIDIpOwp9CgpzdGF0aWMgaW50IF9faW5pdAppbml0X2NtZih2b2lkKQp7CgljaGFyICpmb3JtYXRfc3RyaW5nOwoJY2hhciAqZGV0ZWN0X3N0cmluZyA9ICJwYXJhbWV0ZXIiOwoKCS8qIFdlIGNhbm5vdCByZWFsbHkgYXV0b3Byb2JlIHRoaXMuIElmIHRoZSB1c2VyIGRpZCBub3QgZ2l2ZSBhIHBhcmFtZXRlciwKCSAgIHNlZSBpZiB3ZSBhcmUgcnVubmluZyBvbiB6OTkwIG9yIHVwLCBvdGhlcndpc2UgZmFsbCBiYWNrIHRvIGJhc2ljIG1vZGUuICovCgoJaWYgKGZvcm1hdCA9PSBDTUZfQVVUT0RFVEVDVCkgewoJCWlmICghY3NzX2NoYXJhY3RlcmlzdGljc19hdmFpbCB8fAoJCSAgICAhY3NzX2dlbmVyYWxfY2hhcmFjdGVyaXN0aWNzLmV4dF9tYikgewoJCQlmb3JtYXQgPSBDTUZfQkFTSUM7CgkJfSBlbHNlIHsKCQkJZm9ybWF0ID0gQ01GX0VYVEVOREVEOwoJCX0KCQlkZXRlY3Rfc3RyaW5nID0gImF1dG9kZXRlY3RlZCI7Cgl9IGVsc2UgewoJCWRldGVjdF9zdHJpbmcgPSAicGFyYW1ldGVyIjsKCX0KCglzd2l0Y2ggKGZvcm1hdCkgewoJY2FzZSBDTUZfQkFTSUM6CgkJZm9ybWF0X3N0cmluZyA9ICJiYXNpYyI7CgkJY21ib3BzID0gJmNtYm9wc19iYXNpYzsKCQlpZiAoY21iX2FyZWEubnVtX2NoYW5uZWxzID4gNDA5NiB8fCBjbWJfYXJlYS5udW1fY2hhbm5lbHMgPCAxKSB7CgkJCXByaW50ayhLRVJOX0VSUiAiQmFzaWMgY2hhbm5lbCBtZWFzdXJlbWVudCBmYWNpbGl0eSIKCQkJCQkiIGNhbiBvbmx5IHVzZSAxIHRvIDQwOTYgZGV2aWNlc1xuIgoJCQkgICAgICAgS0VSTl9FUlIgIndoZW4gdGhlIGNtZiBkcml2ZXIgaXMgYnVpbHQiCgkJCQkJIiBhcyBhIGxvYWRhYmxlIG1vZHVsZVxuIik7CgkJCXJldHVybiAxOwoJCX0KCQlicmVhazsKCWNhc2UgQ01GX0VYVEVOREVEOgogCQlmb3JtYXRfc3RyaW5nID0gImV4dGVuZGVkIjsKCQljbWJvcHMgPSAmY21ib3BzX2V4dGVuZGVkOwoJCWJyZWFrOwoJZGVmYXVsdDoKCQlwcmludGsoS0VSTl9FUlIgIkludmFsaWQgZm9ybWF0ICVkIGZvciBjaGFubmVsICIKCQkJIm1lYXN1cmVtZW50IGZhY2lsaXR5XG4iLCBmb3JtYXQpOwoJCXJldHVybiAxOwoJfQoKCXByaW50ayhLRVJOX0lORk8gIkNoYW5uZWwgbWVhc3VyZW1lbnQgZmFjaWxpdHkgdXNpbmcgJXMgZm9ybWF0ICglcylcbiIsCgkJZm9ybWF0X3N0cmluZywgZGV0ZWN0X3N0cmluZyk7CglyZXR1cm4gMDsKfQoKbW9kdWxlX2luaXQoaW5pdF9jbWYpOwoKCk1PRFVMRV9BVVRIT1IoIkFybmQgQmVyZ21hbm4gPGFybmRiQGRlLmlibS5jb20+Iik7Ck1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKTU9EVUxFX0RFU0NSSVBUSU9OKCJjaGFubmVsIG1lYXN1cmVtZW50IGZhY2lsaXR5IGJhc2UgZHJpdmVyXG4iCgkJICAgIkNvcHlyaWdodCAyMDAzIElCTSBDb3Jwb3JhdGlvblxuIik7CgpFWFBPUlRfU1lNQk9MX0dQTChlbmFibGVfY21mKTsKRVhQT1JUX1NZTUJPTF9HUEwoZGlzYWJsZV9jbWYpOwpFWFBPUlRfU1lNQk9MX0dQTChjbWZfcmVhZCk7CkVYUE9SVF9TWU1CT0xfR1BMKGNtZl9yZWFkYWxsKTsK