LyogLSotIG1vZGU6IGM7IGMtYmFzaWMtb2Zmc2V0OiA4IC0qLSAqLwoKLyogU05JIFJNIGRyaXZlcgogKgogKiBDb3B5cmlnaHQgKEMpIDIwMDEgYnkgSmFtZXMuQm90dG9tbGV5QEhhbnNlblBhcnRuZXJzaGlwLmNvbQoqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCioqCioqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoqKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKiogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCioqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgoqKgoqKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCioqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgoqKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQoqKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKioKKiogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCioqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQoqKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCioqCioqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICovCgovKgogKiBCYXNlZCBvbiBsYXNpNzAwLmMKICovCgojaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CiNpbmNsdWRlIDxsaW51eC9tbS5oPgojaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CiNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgojaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgojaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CgojaW5jbHVkZSA8YXNtL3BhZ2UuaD4KI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CiNpbmNsdWRlIDxhc20vaXJxLmg+CiNpbmNsdWRlIDxhc20vZGVsYXkuaD4KCiNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgojaW5jbHVkZSA8c2NzaS9zY3NpX2RldmljZS5oPgojaW5jbHVkZSA8c2NzaS9zY3NpX3RyYW5zcG9ydC5oPgojaW5jbHVkZSA8c2NzaS9zY3NpX3RyYW5zcG9ydF9zcGkuaD4KCiNpbmNsdWRlICI1M2M3MDAuaCIKCk1PRFVMRV9BVVRIT1IoIlRob21hcyBCb2dlbmT2cmZlciIpOwpNT0RVTEVfREVTQ1JJUFRJT04oIlNOSSBSTSA1M2M3MTAgU0NTSSBEcml2ZXIiKTsKTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwoKI2RlZmluZSBTTklSTTcxMF9DTE9DSwkzMgoKc3RhdGljIHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgc25pcm03MTBfdGVtcGxhdGUgPSB7CgkubmFtZQkJPSAiU05JIFJNIFNDU0kgNTNjNzEwIiwKCS5wcm9jX25hbWUJPSAic25pcm1fNTNjNzEwIiwKCS50aGlzX2lkCT0gNywKCS5tb2R1bGUJCT0gVEhJU19NT0RVTEUsCn07CgpzdGF0aWMgaW50IF9faW5pdCBzbmlybTcxMF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCnsKCXVuc2lnbmVkIGxvbmcgYmFzZTsKCXN0cnVjdCBOQ1JfNzAwX0hvc3RfUGFyYW1ldGVycyAqaG9zdGRhdGE7CglzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0OwoJc3RydWN0ICByZXNvdXJjZSAqcmVzOwoKCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKCWlmICghcmVzKQoJCXJldHVybiAtRU5PREVWOwoKCWJhc2UgPSByZXMtPnN0YXJ0OwoJaG9zdGRhdGEgPSBremFsbG9jKHNpemVvZigqaG9zdGRhdGEpLCBHRlBfS0VSTkVMKTsKCWlmICghaG9zdGRhdGEpIHsKCQlwcmludGsoS0VSTl9FUlIgIiVzOiBGYWlsZWQgdG8gYWxsb2NhdGUgaG9zdCBkYXRhXG4iLAoJCSAgICAgICBkZXYtPmRldi5idXNfaWQpOwoJCXJldHVybiAtRU5PTUVNOwoJfQoKCWhvc3RkYXRhLT5kZXYgPSAmZGV2LT5kZXY7CglkbWFfc2V0X21hc2soJmRldi0+ZGV2LCBETUFfMzJCSVRfTUFTSyk7Cglob3N0ZGF0YS0+YmFzZSA9IGlvcmVtYXBfbm9jYWNoZShDUEhZU0FERFIoYmFzZSksIDB4MTAwKTsKCWhvc3RkYXRhLT5kaWZmZXJlbnRpYWwgPSAwOwoKCWhvc3RkYXRhLT5jbG9jayA9IFNOSVJNNzEwX0NMT0NLOwoJaG9zdGRhdGEtPmZvcmNlX2xlX29uX2JlID0gMTsKCWhvc3RkYXRhLT5jaGlwNzEwID0gMTsKCWhvc3RkYXRhLT5idXJzdF9sZW5ndGggPSA0OwoKCWhvc3QgPSBOQ1JfNzAwX2RldGVjdCgmc25pcm03MTBfdGVtcGxhdGUsIGhvc3RkYXRhLCAmZGV2LT5kZXYpOwoJaWYgKCFob3N0KQoJCWdvdG8gb3V0X2tmcmVlOwoJaG9zdC0+dGhpc19pZCA9IDc7Cglob3N0LT5iYXNlID0gYmFzZTsKCWhvc3QtPmlycSA9IHBsYXRmb3JtX2dldF9pcnEoZGV2LCAwKTsKCWlmKHJlcXVlc3RfaXJxKGhvc3QtPmlycSwgTkNSXzcwMF9pbnRyLCBTQV9TSElSUSwgInNuaXJtNzEwIiwgaG9zdCkpIHsKCQlwcmludGsoS0VSTl9FUlIgInNuaXJtNzEwOiByZXF1ZXN0X2lycSBmYWlsZWQhXG4iKTsKCQlnb3RvIG91dF9wdXRfaG9zdDsKCX0KCglkZXZfc2V0X2RydmRhdGEoJmRldi0+ZGV2LCBob3N0KTsKCXNjc2lfc2Nhbl9ob3N0KGhvc3QpOwoKCXJldHVybiAwOwoKIG91dF9wdXRfaG9zdDoKCXNjc2lfaG9zdF9wdXQoaG9zdCk7CiBvdXRfa2ZyZWU6Cglpb3VubWFwKGhvc3RkYXRhLT5iYXNlKTsKCWtmcmVlKGhvc3RkYXRhKTsKCXJldHVybiAtRU5PREVWOwp9CgpzdGF0aWMgaW50IF9fZXhpdCBzbmlybTcxMF9kcml2ZXJfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKewoJc3RydWN0IFNjc2lfSG9zdCAqaG9zdCA9IGRldl9nZXRfZHJ2ZGF0YSgmZGV2LT5kZXYpOwoJc3RydWN0IE5DUl83MDBfSG9zdF9QYXJhbWV0ZXJzICpob3N0ZGF0YSA9CgkJKHN0cnVjdCBOQ1JfNzAwX0hvc3RfUGFyYW1ldGVycyAqKWhvc3QtPmhvc3RkYXRhWzBdOwoKCXNjc2lfcmVtb3ZlX2hvc3QoaG9zdCk7CglOQ1JfNzAwX3JlbGVhc2UoaG9zdCk7CglmcmVlX2lycShob3N0LT5pcnEsIGhvc3QpOwoJaW91bm1hcChob3N0ZGF0YS0+YmFzZSk7CglrZnJlZShob3N0ZGF0YSk7CgoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHNuaXJtNzEwX2RyaXZlciA9IHsKCS5wcm9iZQk9IHNuaXJtNzEwX3Byb2JlLAoJLnJlbW92ZQk9IF9fZGV2ZXhpdF9wKHNuaXJtNzEwX2RyaXZlcl9yZW1vdmUpLAoJLmRyaXZlcgk9IHsKCQkubmFtZQk9ICJzbmlybV81M2M3MTAiLAoJfSwKfTsKCnN0YXRpYyBpbnQgX19pbml0IHNuaXJtNzEwX2luaXQodm9pZCkKewoJaW50IGVycjsKCglpZiAoKGVyciA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3Rlcigmc25pcm03MTBfZHJpdmVyKSkpIHsKCQlwcmludGsoS0VSTl9FUlIgIkRyaXZlciByZWdpc3RyYXRpb24gZmFpbGVkXG4iKTsKCQlyZXR1cm4gZXJyOwoJfQoJcmV0dXJuIDA7Cn0KCnN0YXRpYyB2b2lkIF9fZXhpdCBzbmlybTcxMF9leGl0KHZvaWQpCnsKCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZzbmlybTcxMF9kcml2ZXIpOwp9Cgptb2R1bGVfaW5pdChzbmlybTcxMF9pbml0KTsKbW9kdWxlX2V4aXQoc25pcm03MTBfZXhpdCk7Cg==