LyoKICAgICRJZDogYnR0di1jYXJkcy5jLHYgMS40NyAyMDA1LzAyLzIyIDE0OjA2OjMyIGtyYXhlbCBFeHAgJAoKICAgIGJ0dHYtY2FyZHMuYwoKICAgIHRoaXMgZmlsZSBoYXMgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbnMgLSBjYXJkLXNwZWNpZmljIHN0dWZmCiAgICBsaWtlIHRoZSBiaWcgdHZjYXJkcyBhcnJheSBmb3IgdGhlIG1vc3QgcGFydAoKICAgIENvcHlyaWdodCAoQykgMTk5Niw5Nyw5OCBSYWxwaCAgTWV0emxlciAocmprbUB0aHAudW5pLWtvZWxuLmRlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAmIE1hcmN1cyBNZXR6bGVyIChtb2NtQHRocC51bmkta29lbG4uZGUpCiAgICAoYykgMTk5OS0yMDAxIEdlcmQgS25vcnIgPGtyYXhlbEBnb2xkYmFjaC5pbi1iZXJsaW4uZGU+CgogICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgogICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KCiAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgoKICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCgoqLwoKI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgojaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgojaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KI2luY2x1ZGUgPGxpbnV4L2ttb2QuaD4KI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgojaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgojaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KCiNpbmNsdWRlIDxhc20vaW8uaD4KCiNpbmNsdWRlICJidHR2cC5oIgojaWYgMCAvKiBub3Qgd29ya2luZyB5ZXQgKi8KI2luY2x1ZGUgImJ0ODMyLmgiCiNlbmRpZgoKLyogZndkIGRlY2wgKi8Kc3RhdGljIHZvaWQgYm9vdF9tc3AzNHh4KHN0cnVjdCBidHR2ICpidHYsIGludCBwaW4pOwpzdGF0aWMgdm9pZCBib290X2J0ODMyKHN0cnVjdCBidHR2ICpidHYpOwpzdGF0aWMgdm9pZCBoYXVwcGF1Z2VfZWVwcm9tKHN0cnVjdCBidHR2ICpidHYpOwpzdGF0aWMgdm9pZCBhdmVybWVkaWFfZWVwcm9tKHN0cnVjdCBidHR2ICpidHYpOwpzdGF0aWMgdm9pZCBvc3ByZXlfZWVwcm9tKHN0cnVjdCBidHR2ICpidHYpOwpzdGF0aWMgdm9pZCBtb2R0ZWNfZWVwcm9tKHN0cnVjdCBidHR2ICpidHYpOwpzdGF0aWMgdm9pZCBpbml0X1BYQzIwMChzdHJ1Y3QgYnR0diAqYnR2KTsKCnN0YXRpYyB2b2lkIHdpbnZpZXdfYXVkaW8oc3RydWN0IGJ0dHYgKmJ0diwgc3RydWN0IHZpZGVvX2F1ZGlvICp2LCBpbnQgc2V0KTsKc3RhdGljIHZvaWQgbHQ5NDE1X2F1ZGlvKHN0cnVjdCBidHR2ICpidHYsIHN0cnVjdCB2aWRlb19hdWRpbyAqdiwgaW50IHNldCk7CnN0YXRpYyB2b2lkIGF2ZXJtZWRpYV90dnBob25lX2F1ZGlvKHN0cnVjdCBidHR2ICpidHYsIHN0cnVjdCB2aWRlb19hdWRpbyAqdiwKCQkJCSAgICBpbnQgc2V0KTsKc3RhdGljIHZvaWQgYXZlcm1lZGlhX3R2X3N0ZXJlb19hdWRpbyhzdHJ1Y3QgYnR0diAqYnR2LCBzdHJ1Y3QgdmlkZW9fYXVkaW8gKnYsCgkJCQkgICAgICBpbnQgc2V0KTsKc3RhdGljIHZvaWQgdGVycmF0dl9hdWRpbyhzdHJ1Y3QgYnR0diAqYnR2LCBzdHJ1Y3QgdmlkZW9fYXVkaW8gKnYsIGludCBzZXQpOwpzdGF0aWMgdm9pZCBndmJjdHYzcGNpX2F1ZGlvKHN0cnVjdCBidHR2ICpidHYsIHN0cnVjdCB2aWRlb19hdWRpbyAqdiwgaW50IHNldCk7CnN0YXRpYyB2b2lkIGd2YmN0djVwY2lfYXVkaW8oc3RydWN0IGJ0dHYgKmJ0diwgc3RydWN0IHZpZGVvX2F1ZGlvICp2LCBpbnQgc2V0KTsKc3RhdGljIHZvaWQgd2luZmFzdDIwMDBfYXVkaW8oc3RydWN0IGJ0dHYgKmJ0diwgc3RydWN0IHZpZGVvX2F1ZGlvICp2LCBpbnQgc2V0KTsKc3RhdGljIHZvaWQgcHZidDg3OHA5Yl9hdWRpbyhzdHJ1Y3QgYnR0diAqYnR2LCBzdHJ1Y3QgdmlkZW9fYXVkaW8gKnYsIGludCBzZXQpOwpzdGF0aWMgdm9pZCBmdjIwMDBzX2F1ZGlvKHN0cnVjdCBidHR2ICpidHYsIHN0cnVjdCB2aWRlb19hdWRpbyAqdiwgaW50IHNldCk7CnN0YXRpYyB2b2lkIHdpbmR2cl9hdWRpbyhzdHJ1Y3QgYnR0diAqYnR2LCBzdHJ1Y3QgdmlkZW9fYXVkaW8gKnYsIGludCBzZXQpOwpzdGF0aWMgdm9pZCBhZHR2azUwM19hdWRpbyhzdHJ1Y3QgYnR0diAqYnR2LCBzdHJ1Y3QgdmlkZW9fYXVkaW8gKnYsIGludCBzZXQpOwpzdGF0aWMgdm9pZCBydjYwNV9tdXhzZWwoc3RydWN0IGJ0dHYgKmJ0diwgdW5zaWduZWQgaW50IGlucHV0KTsKc3RhdGljIHZvaWQgZWFnbGVfbXV4c2VsKHN0cnVjdCBidHR2ICpidHYsIHVuc2lnbmVkIGludCBpbnB1dCk7CnN0YXRpYyB2b2lkIHhndWFyZF9tdXhzZWwoc3RydWN0IGJ0dHYgKmJ0diwgdW5zaWduZWQgaW50IGlucHV0KTsKc3RhdGljIHZvaWQgaXZjMTIwX211eHNlbChzdHJ1Y3QgYnR0diAqYnR2LCB1bnNpZ25lZCBpbnQgaW5wdXQpOwpzdGF0aWMgdm9pZCBndmMxMTAwX211eHNlbChzdHJ1Y3QgYnR0diAqYnR2LCB1bnNpZ25lZCBpbnQgaW5wdXQpOwoKc3RhdGljIHZvaWQgUFhDMjAwX211eHNlbChzdHJ1Y3QgYnR0diAqYnR2LCB1bnNpZ25lZCBpbnQgaW5wdXQpOwoKc3RhdGljIHZvaWQgcGljb2xvX3RldHJhX211eHNlbChzdHJ1Y3QgYnR0diAqYnR2LCB1bnNpZ25lZCBpbnQgaW5wdXQpOwpzdGF0aWMgdm9pZCBwaWNvbG9fdGV0cmFfaW5pdChzdHJ1Y3QgYnR0diAqYnR2KTsKCnN0YXRpYyB2b2lkIHRpYmV0Q1MxNl9tdXhzZWwoc3RydWN0IGJ0dHYgKmJ0diwgdW5zaWduZWQgaW50IGlucHV0KTsKc3RhdGljIHZvaWQgdGliZXRDUzE2X2luaXQoc3RydWN0IGJ0dHYgKmJ0dik7CgpzdGF0aWMgdm9pZCBrb2RpY29tNDQwMHJfbXV4c2VsKHN0cnVjdCBidHR2ICpidHYsIHVuc2lnbmVkIGludCBpbnB1dCk7CnN0YXRpYyB2b2lkIGtvZGljb200NDAwcl9pbml0KHN0cnVjdCBidHR2ICpidHYpOwoKc3RhdGljIHZvaWQgc2lnbWFTTENfbXV4c2VsKHN0cnVjdCBidHR2ICpidHYsIHVuc2lnbmVkIGludCBpbnB1dCk7CnN0YXRpYyB2b2lkIHNpZ21hU1FfbXV4c2VsKHN0cnVjdCBidHR2ICpidHYsIHVuc2lnbmVkIGludCBpbnB1dCk7CgpzdGF0aWMgaW50IHRlcnJhdGVjX2FjdGl2ZV9yYWRpb191cGdyYWRlKHN0cnVjdCBidHR2ICpidHYpOwpzdGF0aWMgaW50IHRlYTU3NTdfcmVhZChzdHJ1Y3QgYnR0diAqYnR2KTsKc3RhdGljIGludCB0ZWE1NzU3X3dyaXRlKHN0cnVjdCBidHR2ICpidHYsIGludCB2YWx1ZSk7CnN0YXRpYyB2b2lkIGlkZW50aWZ5X2J5X2VlcHJvbShzdHJ1Y3QgYnR0diAqYnR2LAoJCQkgICAgICAgdW5zaWduZWQgY2hhciBlZXByb21fZGF0YVsyNTZdKTsKc3RhdGljIGludCBfX2RldmluaXQgcHZyX2Jvb3Qoc3RydWN0IGJ0dHYgKmJ0dik7CgovKiBjb25maWcgdmFyaWFibGVzICovCnN0YXRpYyB1bnNpZ25lZCBpbnQgdHJpdG9uMT0wOwpzdGF0aWMgdW5zaWduZWQgaW50IHZzZng9MDsKc3RhdGljIHVuc2lnbmVkIGludCBsYXRlbmN5ID0gVU5TRVQ7CnN0YXRpYyB1bnNpZ25lZCBpbnQgbm9fb3ZlcmxheT0tMTsKCnN0YXRpYyB1bnNpZ25lZCBpbnQgY2FyZFtCVFRWX01BWF0gICA9IHsgWyAwIC4uLiAoQlRUVl9NQVgtMSkgXSA9IFVOU0VUIH07CnN0YXRpYyB1bnNpZ25lZCBpbnQgcGxsW0JUVFZfTUFYXSAgICA9IHsgWyAwIC4uLiAoQlRUVl9NQVgtMSkgXSA9IFVOU0VUIH07CnN0YXRpYyB1bnNpZ25lZCBpbnQgdHVuZXJbQlRUVl9NQVhdICA9IHsgWyAwIC4uLiAoQlRUVl9NQVgtMSkgXSA9IFVOU0VUIH07CnN0YXRpYyB1bnNpZ25lZCBpbnQgc3Zoc1tCVFRWX01BWF0gICA9IHsgWyAwIC4uLiAoQlRUVl9NQVgtMSkgXSA9IFVOU0VUIH07CnN0YXRpYyB1bnNpZ25lZCBpbnQgcmVtb3RlW0JUVFZfTUFYXSA9IHsgWyAwIC4uLiAoQlRUVl9NQVgtMSkgXSA9IFVOU0VUIH07CnN0YXRpYyBzdHJ1Y3QgYnR0diAgKm1hc3RlcltCVFRWX01BWF0gPSB7IFsgMCAuLi4gKEJUVFZfTUFYLTEpIF0gPSBOVUxMIH07CiNpZmRlZiBNT0RVTEUKc3RhdGljIHVuc2lnbmVkIGludCBhdXRvbG9hZCA9IDE7CiNlbHNlCnN0YXRpYyB1bnNpZ25lZCBpbnQgYXV0b2xvYWQgPSAwOwojZW5kaWYKc3RhdGljIHVuc2lnbmVkIGludCBncGlvbWFzayA9IFVOU0VUOwpzdGF0aWMgdW5zaWduZWQgaW50IGF1ZGlvYWxsID0gVU5TRVQ7CnN0YXRpYyB1bnNpZ25lZCBpbnQgYXVkaW9tdXhbNV0gPSB7IFsgMCAuLi4gNCBdID0gVU5TRVQgfTsKCi8qIGluc21vZCBvcHRpb25zICovCm1vZHVsZV9wYXJhbSh0cml0b24xLCAgICBpbnQsIDA0NDQpOwptb2R1bGVfcGFyYW0odnNmeCwgICAgICAgaW50LCAwNDQ0KTsKbW9kdWxlX3BhcmFtKG5vX292ZXJsYXksIGludCwgMDQ0NCk7Cm1vZHVsZV9wYXJhbShsYXRlbmN5LCAgICBpbnQsIDA0NDQpOwptb2R1bGVfcGFyYW0oZ3Bpb21hc2ssICAgaW50LCAwNDQ0KTsKbW9kdWxlX3BhcmFtKGF1ZGlvYWxsLCAgIGludCwgMDQ0NCk7Cm1vZHVsZV9wYXJhbShhdXRvbG9hZCwgICBpbnQsIDA0NDQpOwoKbW9kdWxlX3BhcmFtX2FycmF5KGNhcmQsICAgICBpbnQsIE5VTEwsIDA0NDQpOwptb2R1bGVfcGFyYW1fYXJyYXkocGxsLCAgICAgIGludCwgTlVMTCwgMDQ0NCk7Cm1vZHVsZV9wYXJhbV9hcnJheSh0dW5lciwgICAgaW50LCBOVUxMLCAwNDQ0KTsKbW9kdWxlX3BhcmFtX2FycmF5KHN2aHMsICAgICBpbnQsIE5VTEwsIDA0NDQpOwptb2R1bGVfcGFyYW1fYXJyYXkocmVtb3RlLCAgIGludCwgTlVMTCwgMDQ0NCk7Cm1vZHVsZV9wYXJhbV9hcnJheShhdWRpb211eCwgaW50LCBOVUxMLCAwNDQ0KTsKCk1PRFVMRV9QQVJNX0RFU0ModHJpdG9uMSwic2V0IEVUQkYgcGNpIGNvbmZpZyBiaXQgIgoJCSAiW2VuYWJsZSBidWcgY29tcGF0aWJpbGl0eSBmb3IgdHJpdG9uMSArIG90aGVyc10iKTsKTU9EVUxFX1BBUk1fREVTQyh2c2Z4LCJzZXQgVlNGWCBwY2kgY29uZmlnIGJpdCAiCgkJICJbeWV0IGFub3RoZXIgY2hpcHNldCBmbGF3IHdvcmthcm91bmRdIik7Ck1PRFVMRV9QQVJNX0RFU0MobGF0ZW5jeSwicGNpIGxhdGVuY3kgdGltZXIiKTsKTU9EVUxFX1BBUk1fREVTQyhjYXJkLCJzcGVjaWZ5IFRWL2dyYWJiZXIgY2FyZCBtb2RlbCwgc2VlIENBUkRMSVNUIGZpbGUgZm9yIGEgbGlzdCIpOwpNT0RVTEVfUEFSTV9ERVNDKHBsbCwic3BlY2lmeSBpbnN0YWxsZWQgY3J5c3RhbCAoMD1ub25lLCAyOD0yOCBNSHosIDM1PTM1IE1IeikiKTsKTU9EVUxFX1BBUk1fREVTQyh0dW5lciwic3BlY2lmeSBpbnN0YWxsZWQgdHVuZXIgdHlwZSIpOwpNT0RVTEVfUEFSTV9ERVNDKGF1dG9sb2FkLCJhdXRvbWF0aWNhbGx5IGxvYWQgaTJjIG1vZHVsZXMgbGlrZSB0dW5lci5vLCBkZWZhdWx0IGlzIDEgKHllcykiKTsKCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi8qIGxpc3Qgb2YgY2FyZCBJRHMgZm9yIGJ0ODc4KyBjYXJkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgpzdGF0aWMgc3RydWN0IENBUkQgewoJdW5zaWduZWQgaWQ7CglpbnQgY2FyZG5yOwoJY2hhciAqbmFtZTsKfSBjYXJkc1tdIF9fZGV2aW5pdGRhdGEgPSB7Cgl7IDB4MTNlYjAwNzAsIEJUVFZfSEFVUFBBVUdFODc4LCAgIkhhdXBwYXVnZSBXaW5UViIgfSwKCXsgMHgzOTAwMDA3MCwgQlRUVl9IQVVQUEFVR0U4NzgsICAiSGF1cHBhdWdlIFdpblRWLUQiIH0sCgl7IDB4NDUwMDAwNzAsIEJUVFZfSEFVUFBBVUdFUFZSLCAgIkhhdXBwYXVnZSBXaW5UVi9QVlIiIH0sCgl7IDB4ZmYwMDAwNzAsIEJUVFZfT1NQUkVZMXgwLCAgICAgIk9zcHJleS0xMDAiIH0sCgl7IDB4ZmYwMTAwNzAsIEJUVFZfT1NQUkVZMngwX1NWSUQsIk9zcHJleS0yMDAiIH0sCgl7IDB4ZmYwMjAwNzAsIEJUVFZfT1NQUkVZNTAwLCAgICAgIk9zcHJleS01MDAiIH0sCgl7IDB4ZmYwMzAwNzAsIEJUVFZfT1NQUkVZMjAwMCwgICAgIk9zcHJleS0yMDAwIiB9LAoJeyAweGZmMDQwMDcwLCBCVFRWX09TUFJFWTU0MCwgICAgICJPc3ByZXktNTQwIiB9LAoKCXsgMHgwMDAxMTAwMiwgQlRUVl9BVElfVFZXT05ERVIsICAiQVRJIFRWIFdvbmRlciIgfSwKCXsgMHgwMDAzMTAwMiwgQlRUVl9BVElfVFZXT05ERVJWRSwiQVRJIFRWIFdvbmRlci9WRSIgfSwKCgl7IDB4NjYwNjEwN2QsIEJUVFZfV0lORkFTVDIwMDAsICAgIkxlYWR0ZWsgV2luRmFzdCBUViAyMDAwIiB9LAoJeyAweDY2MDcxMDdkLCBCVFRWX1dJTkZBU1RWQzEwMCwgICJMZWFkdGVrIFdpbkZhc3QgVkMgMTAwIiB9LAoJeyAweDY2MDkxMDdkLCBCVFRWX1dJTkZBU1QyMDAwLCAgICJMZWFkdGVrIFRWIDIwMDAgWFAiIH0sCgl7IDB4MjYzNjEwYjQsIEJUVFZfU1RCMiwgICAgICAgICAgIlNUQiBUViBQQ0kgRk0sIEdhdGV3YXkgUC9OIDYwMDA3MDQiIH0sCgl7IDB4MjY0NTEwYjQsIEJUVFZfU1RCMiwgICAgICAgICAgIlNUQiBUViBQQ0kgRk0sIEdhdGV3YXkgUC9OIDYwMDA3MDQiIH0sCiAJeyAweDQwMjAxMGZjLCBCVFRWX0dWQkNUVjNQQ0ksICAgICJJLU8gRGF0YSBDby4gR1YtQkNUVjMvUENJIiB9LAoJeyAweDQwNTAxMGZjLCBCVFRWX0dWQkNUVjRQQ0ksICAgICJJLU8gRGF0YSBDby4gR1YtQkNUVjQvUENJIiB9LAoJeyAweDQwNzAxMGZjLCBCVFRWX0dWQkNUVjVQQ0ksICAgICJJLU8gRGF0YSBDby4gR1YtQkNUVjUvUENJIiB9LAogCXsgMHhkMDE4MTBmYywgQlRUVl9HVkJDVFY1UENJLCAgICAiSS1PIERhdGEgQ28uIEdWLUJDVFY1L1BDSSIgfSwKCgl7IDB4MDAxMjExYmQsIEJUVFZfUElOTkFDTEUsICAgICAgIlBpbm5hY2xlIFBDVFYiIH0sCgkvLyBzb21lIGNhcmRzIHNoaXAgd2l0aCBieXRlc3dhcHBlZCBJRHMgLi4uCgl7IDB4MTIwMGJkMTEsIEJUVFZfUElOTkFDTEUsICAgICAgIlBpbm5hY2xlIFBDVFYgW2Jzd2FwXSIgfSwKCXsgMHhmZjAwYmQxMSwgQlRUVl9QSU5OQUNMRSwgICAgICAiUGlubmFjbGUgUENUViBbYnN3YXBdIiB9LAoJLy8gdGhpcyBzZWVtcyB0byBoYXBwZW4gYXMgd2VsbCAuLi4KCXsgMHhmZjEyMTFiZCwgQlRUVl9QSU5OQUNMRSwgICAgICAiUGlubmFjbGUgUENUViIgfSwKCgl7IDB4MzAwMDEyMWEsIEJUVFZfVk9PRE9PVFZfRk0sICAgIjNEZnggVm9vZG9vVFYgRk0vIFZvb2Rvb1RWIDIwMCIgfSwKCXsgMHgyNjM3MTBiNCwgQlRUVl9WT09ET09UVl9GTSwgICAiM0RmeCBWb29kb29UViBGTS8gVm9vZG9vVFYgMjAwIiB9LAoJeyAweDMwNjAxMjFhLCBCVFRWX1NUQjIsCSAgIjNEZnggVm9vZG9vVFYgMTAwLyBTVEIgT0VNIiB9LAoKCXsgMHgzMDAwMTQ0ZiwgQlRUVl9NQUdJQ1RWSUVXMDYzLCAiKEFza2V5IE1hZ2ljL290aGVycykgVFZpZXc5OSBDUEgwNngiIH0sCgl7IDB4YTAwNTE0NGYsIEJUVFZfTUFHSUNUVklFVzA2MywgIkNQSDA2WCBUVmlldzk5LUNhcmQiIH0sCgl7IDB4MzAwMjE0NGYsIEJUVFZfTUFHSUNUVklFVzA2MSwgIihBc2tleSBNYWdpYy9vdGhlcnMpIFRWaWV3OTkgQ1BIMDV4IiB9LAoJeyAweDMwMDUxNDRmLCBCVFRWX01BR0lDVFZJRVcwNjEsICIoQXNrZXkgTWFnaWMvb3RoZXJzKSBUVmlldzk5IENQSDA2MS8wNkwgKFQxL0xDKSIgfSwKCXsgMHg1MDAwMTQ0ZiwgQlRUVl9NQUdJQ1RWSUVXMDYxLCAiQXNrZXkgQ1BIMDUwIiB9LAoJeyAweDMwMDAxNGZmLCBCVFRWX01BR0lDVFZJRVcwNjEsICJUVmlldyA5OSAoQ1BIMDYxKSIgfSwKCXsgMHgzMDAyMTRmZiwgQlRUVl9QSE9FQkVfVFZNQVMsICAiUGhvZWJlIFRWIE1hc3RlciAoQ1BIMDYwKSIgfSwKCgl7IDB4MDAwMTE0NjEsIEJUVFZfQVZQSE9ORTk4LCAgICAgIkFWZXJNZWRpYSBUVlBob25lOTgiIH0sCgl7IDB4MDAwMjE0NjEsIEJUVFZfQVZFUk1FRElBOTgsICAgIkFWZXJtZWRpYSBUVkNhcHR1cmUgOTgiIH0sCgl7IDB4MDAwMzE0NjEsIEJUVFZfQVZQSE9ORTk4LCAgICAgIkFWZXJNZWRpYSBUVlBob25lOTgiIH0sCgl7IDB4MDAwNDE0NjEsIEJUVFZfQVZFUk1FRElBOTgsICAgIkFWZXJNZWRpYSBUVkNhcHR1cmUgOTgiIH0sCgl7IDB4MDMwMDE0NjEsIEJUVFZfQVZFUk1FRElBOTgsICAgIlZET01BVEUgVFYgVFVORVIgQ0FSRCIgfSwKCgl7IDB4MTExNzE1M2IsIEJUVFZfVEVSUkFUVkFMVUUsICAgIlRlcnJhdGVjIFRWYWx1ZSAoUGhpbGlwcyBQQUwgQi9HKSIgfSwKCXsgMHgxMTE4MTUzYiwgQlRUVl9URVJSQVRWQUxVRSwgICAiVGVycmF0ZWMgVFZhbHVlIChUZW1pYyBQQUwgQi9HKSIgfSwKCXsgMHgxMTE5MTUzYiwgQlRUVl9URVJSQVRWQUxVRSwgICAiVGVycmF0ZWMgVFZhbHVlIChQaGlsaXBzIFBBTCBJKSIgfSwKCXsgMHgxMTFhMTUzYiwgQlRUVl9URVJSQVRWQUxVRSwgICAiVGVycmF0ZWMgVFZhbHVlIChUZW1pYyBQQUwgSSkiIH0sCgoJeyAweDExMjMxNTNiLCBCVFRWX1RFUlJBVFZSQURJTywgICJUZXJyYXRlYyBUViBSYWRpbysiIH0sCgl7IDB4MTEyNzE1M2IsIEJUVFZfVEVSUkFUViwgICAgICAgIlRlcnJhdGVjIFRWKyAoVjEuMDUpIiAgICB9LAoJLy8gY2xhc2hlcyB3aXRoIEZseVZpZGVvCgkvL3sgMHgxODUyMTg1MiwgQlRUVl9URVJSQVRWLCAgICAgIlRlcnJhdGVjIFRWKyAoVjEuMTApIiAgICB9LAoJeyAweDExMzQxNTNiLCBCVFRWX1RFUlJBVFZBTFVFLCAgICJUZXJyYXRlYyBUVmFsdWUgKExSMTAyKSIgfSwKCXsgMHgxMTM1MTUzYiwgQlRUVl9URVJSQVRWQUxVRVIsICAiVGVycmF0ZWMgVFZhbHVlIFJhZGlvIiB9LCAvLyBMUjEwMgoJeyAweDUwMTgxNTNiLCBCVFRWX1RFUlJBVFZBTFVFLCAgICJUZXJyYXRlYyBUVmFsdWUiIH0sICAgICAgIC8vID8/Cgl7IDB4ZmYzYjE1M2IsIEJUVFZfVEVSUkFUVkFMVUVSLCAgIlRlcnJhdGVjIFRWYWx1ZSBSYWRpbyIgfSwgLy8gPz8KCgl7IDB4NDAwMDE1YjAsIEJUVFZfWk9MVFJJWF9HRU5JRSwgIlpvbHRyaXggR2VuaWUgVFYiIH0sCgl7IDB4NDAwYTE1YjAsIEJUVFZfWk9MVFJJWF9HRU5JRSwgIlpvbHRyaXggR2VuaWUgVFYiIH0sCgl7IDB4NDAwZDE1YjAsIEJUVFZfWk9MVFJJWF9HRU5JRSwgIlpvbHRyaXggR2VuaWUgVFYgLyBSYWRpbyIgfSwKCXsgMHg0MDEwMTViMCwgQlRUVl9aT0xUUklYX0dFTklFLCAiWm9sdHJpeCBHZW5pZSBUViAvIFJhZGlvIiB9LAoJeyAweDQwMTYxNWIwLCBCVFRWX1pPTFRSSVhfR0VOSUUsICJab2x0cml4IEdlbmllIFRWIC8gUmFkaW8iIH0sCgoJeyAweDE0MzBhYTAwLCBCVFRWX1BWMTQzLCAgICAgICAgICJQcm92aWRlbyBQVjE0M0EiIH0sCgl7IDB4MTQzMWFhMDAsIEJUVFZfUFYxNDMsICAgICAgICAgIlByb3ZpZGVvIFBWMTQzQiIgfSwKCXsgMHgxNDMyYWEwMCwgQlRUVl9QVjE0MywgICAgICAgICAiUHJvdmlkZW8gUFYxNDNDIiB9LAoJeyAweDE0MzNhYTAwLCBCVFRWX1BWMTQzLCAgICAgICAgICJQcm92aWRlbyBQVjE0M0QiIH0sCgl7IDB4MTQzM2FhMDMsIEJUVFZfUFYxNDMsICAgICAgICAgIlNlY3VyaXR5IEV5ZXMiIH0sCgoJeyAweDE0NjBhYTAwLCBCVFRWX1BWMTUwLCAgICAgICAgICJQcm92aWRlbyBQVjE1MEEtMSIgfSwKCXsgMHgxNDYxYWEwMSwgQlRUVl9QVjE1MCwgICAgICAgICAiUHJvdmlkZW8gUFYxNTBBLTIiIH0sCgl7IDB4MTQ2MmFhMDIsIEJUVFZfUFYxNTAsICAgICAgICAgIlByb3ZpZGVvIFBWMTUwQS0zIiB9LAoJeyAweDE0NjNhYTAzLCBCVFRWX1BWMTUwLCAgICAgICAgICJQcm92aWRlbyBQVjE1MEEtNCIgfSwKCgl7IDB4MTQ2NGFhMDQsIEJUVFZfUFYxNTAsICAgICAgICAgIlByb3ZpZGVvIFBWMTUwQi0xIiB9LAoJeyAweDE0NjVhYTA1LCBCVFRWX1BWMTUwLCAgICAgICAgICJQcm92aWRlbyBQVjE1MEItMiIgfSwKCXsgMHgxNDY2YWEwNiwgQlRUVl9QVjE1MCwgICAgICAgICAiUHJvdmlkZW8gUFYxNTBCLTMiIH0sCgl7IDB4MTQ2N2FhMDcsIEJUVFZfUFYxNTAsICAgICAgICAgIlByb3ZpZGVvIFBWMTUwQi00IiB9LAoKCXsgMHhhMTMyZmYwMCwgQlRUVl9JVkMxMDAsICAgICAgICAiSVZDLTEwMCIgIH0sCgl7IDB4YTE1NTAwMDAsIEJUVFZfSVZDMjAwLCAgICAgICAgIklWQy0yMDAiICB9LAoJeyAweGExNTUwMDAxLCBCVFRWX0lWQzIwMCwgICAgICAgICJJVkMtMjAwIiAgfSwKCXsgMHhhMTU1MDAwMiwgQlRUVl9JVkMyMDAsICAgICAgICAiSVZDLTIwMCIgIH0sCgl7IDB4YTE1NTAwMDMsIEJUVFZfSVZDMjAwLCAgICAgICAgIklWQy0yMDAiICB9LAoJeyAweGExNTUwMTAwLCBCVFRWX0lWQzIwMCwgICAgICAgICJJVkMtMjAwRyIgfSwKCXsgMHhhMTU1MDEwMSwgQlRUVl9JVkMyMDAsICAgICAgICAiSVZDLTIwMEciIH0sCgl7IDB4YTE1NTAxMDIsIEJUVFZfSVZDMjAwLCAgICAgICAgIklWQy0yMDBHIiB9LAoJeyAweGExNTUwMTAzLCBCVFRWX0lWQzIwMCwgICAgICAgICJJVkMtMjAwRyIgfSwKCXsgMHhhMTgyZmYwMCwgQlRUVl9JVkMxMjAsICAgICAgICAiSVZDLTEyMEciIH0sCgl7IDB4YTE4MmZmMDEsIEJUVFZfSVZDMTIwLCAgICAgICAgIklWQy0xMjBHIiB9LAoJeyAweGExODJmZjAyLCBCVFRWX0lWQzEyMCwgICAgICAgICJJVkMtMTIwRyIgfSwKCXsgMHhhMTgyZmYwMywgQlRUVl9JVkMxMjAsICAgICAgICAiSVZDLTEyMEciIH0sCgl7IDB4YTE4MmZmMDQsIEJUVFZfSVZDMTIwLCAgICAgICAgIklWQy0xMjBHIiB9LAoJeyAweGExODJmZjA1LCBCVFRWX0lWQzEyMCwgICAgICAgICJJVkMtMTIwRyIgfSwKCXsgMHhhMTgyZmYwNiwgQlRUVl9JVkMxMjAsICAgICAgICAiSVZDLTEyMEciIH0sCgl7IDB4YTE4MmZmMDcsIEJUVFZfSVZDMTIwLCAgICAgICAgIklWQy0xMjBHIiB9LAoJeyAweGExODJmZjA4LCBCVFRWX0lWQzEyMCwgICAgICAgICJJVkMtMTIwRyIgfSwKCXsgMHhhMTgyZmYwOSwgQlRUVl9JVkMxMjAsICAgICAgICAiSVZDLTEyMEciIH0sCgl7IDB4YTE4MmZmMGEsIEJUVFZfSVZDMTIwLCAgICAgICAgIklWQy0xMjBHIiB9LAoJeyAweGExODJmZjBiLCBCVFRWX0lWQzEyMCwgICAgICAgICJJVkMtMTIwRyIgfSwKCXsgMHhhMTgyZmYwYywgQlRUVl9JVkMxMjAsICAgICAgICAiSVZDLTEyMEciIH0sCgl7IDB4YTE4MmZmMGQsIEJUVFZfSVZDMTIwLCAgICAgICAgIklWQy0xMjBHIiB9LAoJeyAweGExODJmZjBlLCBCVFRWX0lWQzEyMCwgICAgICAgICJJVkMtMTIwRyIgfSwKCXsgMHhhMTgyZmYwZiwgQlRUVl9JVkMxMjAsICAgICAgICAiSVZDLTEyMEciIH0sCgoJeyAweDQxNDI0MzQ0LCBCVFRWX0dSQU5EVEVDLCAgICAgICJHcmFuZFRlYyBNdWx0aSBDYXB0dXJlIiB9LAoJeyAweDAxMDIwMzA0LCBCVFRWX1hHVUFSRCwgICAgICAgICJHcmFuZHRlYyBHcmFuZCBYLUd1YXJkIiB9LAoKCXsgMHgxODUwMTg1MSwgQlRUVl9DSFJPTk9TX1ZTMiwgICAiRmx5VmlkZW8gOTggKExSNTApLyBDaHJvbm9zIFZpZGVvIFNodXR0bGUgSUkiIH0sCgl7IDB4YTA1MDE4NTEsIEJUVFZfQ0hST05PU19WUzIsICAgIkZseVZpZGVvIDk4IChMUjUwKS8gQ2hyb25vcyBWaWRlbyBTaHV0dGxlIElJIiB9LAoJeyAweDE4NTExODUxLCBCVFRWX0ZMWVZJREVPOThFWiwgICJGbHlWaWRlbyA5OEVaIChMUjUxKS8gQ3liZXJNYWlsIEFWIiB9LAoJeyAweDE4NTIxODUyLCBCVFRWX1RZUEhPT05fVFZJRVcsICJGbHlWaWRlbyA5OEZNIChMUjUwKS8gVHlwaG9vbiBUVmlldyBUVi9GTSBUdW5lciIgfSwKCXsgMHg0MWEwYTA1MSwgQlRUVl9GTFlWSURFT185OEZNLCAiTGlmZXZpZXcgRmx5VmlkZW8gOTggTFI1MCBSZXYgUSIgfSwKCXsgMHgxODUwMWY3ZiwgQlRUVl9GTFlWSURFT185OCwgICAiTGlmZXZpZXcgRmx5dmlkZW8gOTgiIH0sCgogICAgCXsgMHgwMTAxMTVjYiwgQlRUVl9HTVYxLCAgICAgICAgICAiQUcgR01WMSIgfSwKCXsgMHgwMTAxMTRjNywgQlRUVl9NT0RURUNfMjA1LCAgICAiTW9kdWxhciBUZWNobm9sb2d5IE1NMjAxL01NMjAyL01NMjA1L01NMjEwL01NMjE1IFBDVFYiIH0sCgoJeyAweDEwYjQyNjM2LCBCVFRWX0hBVVBQQVVHRTg3OCwgICJTVEIgPz8/IiB9LAoJeyAweDIxN2Q2NjA2LCBCVFRWX1dJTkZBU1QyMDAwLCAgICJMZWFkdGVrIFdpbkZhc3QgVFYgMjAwMCIgfSwKCXsgMHhmZmY2ZjZmZiwgQlRUVl9XSU5GQVNUMjAwMCwgICAiTGVhZHRlayBXaW5GYXN0IFRWIDIwMDAiIH0sCgl7IDB4MDMxMTYwMDAsIEJUVFZfU0VOU09SQVkzMTEsICAgIlNlbnNvcmF5IDMxMSIgfSwKCXsgMHgwMDc5MGUxMSwgQlRUVl9XSU5EVlIsICAgICAgICAiQ2Fub3B1cyBXaW5EVlIgUENJIiB9LAoJeyAweGEwZmNhMWEwLCBCVFRWX1pPTFRSSVgsICAgICAgICJGYWNlIHRvIEZhY2UgVHZtYXgiIH0sCgl7IDB4MjAwMDcwNjMsIEJUVFZfUENfSERUViwgICAgICAgInBjSERUViBIRC0yMDAwIFRWIn0sCgl7IDB4ODJiMmFhNmEsIEJUVFZfU0lNVVNfR1ZDMTEwMCwgIlNJTVVTIEdWQzExMDAiIH0sCgl7IDB4MTQ2Y2FhMGMsIEJUVFZfUFY5NTEsICAgICAgICAgIml0dW5lciBzcGVjdHJhOCIgfSwKIAl7IDB4MjAwYTEyOTUsIEJUVFZfUFhDMjAwLCAgICAgICAgIkltYWdlTmF0aW9uIFBYQzIwMEEiIH0sCgoJeyAweDQwMTExNTU0LCBCVFRWX1BWX0JUODc4UF85QiwgICJQcm9saW5rIFBpeGVsdmlldyBQVi1CVCIgfSwKCXsgMHgxN2RlMGEwMSwgQlRUVl9LV09STEQsICAgICAgICAiTWVjZXIgVFYvRk0vVmlkZW8gVHVuZXIiIH0sCgoJeyAweDAxMDUxODA1LCBCVFRWX1BJQ09MT19URVRSQV9DSElQLCAiUGljb2xvIFRldHJhIENoaXAgIzEiIH0sCgl7IDB4MDEwNjE4MDUsIEJUVFZfUElDT0xPX1RFVFJBX0NISVAsICJQaWNvbG8gVGV0cmEgQ2hpcCAjMiIgfSwKCXsgMHgwMTA3MTgwNSwgQlRUVl9QSUNPTE9fVEVUUkFfQ0hJUCwgIlBpY29sbyBUZXRyYSBDaGlwICMzIiB9LAoJeyAweDAxMDgxODA1LCBCVFRWX1BJQ09MT19URVRSQV9DSElQLCAiUGljb2xvIFRldHJhIENoaXAgIzQiIH0sCgoJLy8gbGlrZWx5IGJyb2tlbiwgdmVuZG9yIGlkIGRvZXNuJ3QgbWF0Y2ggdGhlIG90aGVyIG1hZ2ljIHZpZXdzIC4uLgoJLy97IDB4YTBmY2EwNGYsIEJUVFZfTUFHSUNUVklFVzA2MywgIkd1aWxsZW1vdCBNYXhpIFRWIFZpZGVvIDMiIH0sCgoJLy8gRFZCIGNhcmRzICh1c2luZyBwY2kgZnVuY3Rpb24gLjEgZm9yIG1wZWcgZGF0YSB4ZmVyKQoJeyAweDAxMDEwMDcxLCBCVFRWX05FQlVMQV9ESUdJVFYsICJOZWJ1bGEgRWxlY3Ryb25pY3MgRGlnaVRWIiB9LAoJeyAweDA3NjExNDYxLCBCVFRWX0FWRFZCVF83NjEsICAgICJBdmVyTWVkaWEgQXZlclRWIERWQi1UIDc2MSIgfSwKCXsgMHgwMDFjMTFiZCwgQlRUVl9QSU5OQUNMRVNBVCwgICAiUGlubmFjbGUgUENUViBTYXQiIH0sCgl7IDB4MDAyNjExYmQsIEJUVFZfVFdJTkhBTl9EU1QsICAgIlBpbm5hY2xlIFBDVFYgU0FUIENJIiB9LAoJeyAweDAwMDExODIyLCBCVFRWX1RXSU5IQU5fRFNULCAgICJUd2luaGFuIFZpc2lvblBsdXMgRFZCIiB9LAoJeyAweGZjMDAyNzBmLCBCVFRWX1RXSU5IQU5fRFNULCAgICJDaGFpblRlY2ggZGlnaXRvcCBEU1QtMTAwMCBEVkItUyIgfSwKCXsgMHgwNzcxMTQ2MSwgQlRUVl9BVkRWQlRfNzcxLCAgICAiQVZlcm1lZGlhIEF2ZXJUViBEVkItVCA3NzEiIH0sCgl7IDB4ZGIxMDE4YWMsIEJUVFZfRFZJQ09fRFZCVF9MSVRFLCAgICAiRFZJQ08gRnVzaW9uSERUViBEVkItVCBMaXRlIiB9LAoKCXsgMCwgLTEsIE5VTEwgfQp9OwoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLyogYXJyYXkgd2l0aCBkZXNjcmlwdGlvbiBmb3IgYnQ4NDggLyBidDg3OCB0di9ncmFiYmVyIGNhcmRzICAgICAgICAgICAgICAgKi8KCnN0cnVjdCB0dmNhcmQgYnR0dl90dmNhcmRzW10gPSB7CnsKLyogLS0tLSBjYXJkIDB4MDAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJLm5hbWUJCT0gIiAqKiogVU5LTk9XTi9HRU5FUklDICoqKiAiLAoJLnZpZGVvX2lucHV0cwk9IDQsCgkuYXVkaW9faW5wdXRzCT0gMSwKCS50dW5lcgkJPSAwLAoJLnN2aHMJCT0gMiwKCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAwfSwKCS50dW5lcl90eXBlCT0gLTEsCn0sewoJLm5hbWUJCT0gIk1JUk8gUENUViIsCgkudmlkZW9faW5wdXRzCT0gNCwKCS5hdWRpb19pbnB1dHMJPSAxLAoJLnR1bmVyCQk9IDAsCgkuc3ZocwkJPSAyLAoJLmdwaW9tYXNrCT0gMTUsCgkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sCgkuYXVkaW9tdXgJPSB7IDIsIDAsIDAsIDAsIDEwfSwKCS5uZWVkc190dmF1ZGlvCT0gMSwKCS50dW5lcl90eXBlCT0gLTEsCn0sewoJLm5hbWUJCT0gIkhhdXBwYXVnZSAoYnQ4NDgpIiwKCS52aWRlb19pbnB1dHMJPSA0LAoJLmF1ZGlvX2lucHV0cwk9IDEsCgkudHVuZXIJCT0gMCwKCS5zdmhzCQk9IDIsCgkuZ3Bpb21hc2sJPSA3LAoJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAoJLmF1ZGlvbXV4CT0geyAwLCAxLCAyLCAzLCA0fSwKCS5uZWVkc190dmF1ZGlvCT0gMSwKCS50dW5lcl90eXBlCT0gLTEsCn0sewoJLm5hbWUJCT0gIlNUQiwgR2F0ZXdheSBQL04gNjAwMDY5OSAoYnQ4NDgpIiwKCS52aWRlb19pbnB1dHMJPSAzLAoJLmF1ZGlvX2lucHV0cwk9IDEsCgkudHVuZXIJCT0gMCwKCS5zdmhzCQk9IDIsCgkuZ3Bpb21hc2sJPSA3LAoJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAoJLmF1ZGlvbXV4CT0geyA0LCAwLCAyLCAzLCAxfSwKCS5ub19tc3AzNHh4CT0gMSwKCS5uZWVkc190dmF1ZGlvCT0gMSwKCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfTlRTQywKCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCS5oYXNfcmFkaW8gICAgICA9IDEsCn0sewoKLyogLS0tLSBjYXJkIDB4MDQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJLm5hbWUJCT0gIkludGVsIENyZWF0ZSBhbmQgU2hhcmUgUENJLyBTbWFydCBWaWRlbyBSZWNvcmRlciBJSUkiLAoJLnZpZGVvX2lucHV0cwk9IDQsCgkuYXVkaW9faW5wdXRzCT0gMCwKCS50dW5lcgkJPSAtMSwKCS5zdmhzCQk9IDIsCgkuZ3Bpb21hc2sJPSAwLAoJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAoJLmF1ZGlvbXV4CT0geyAwIH0sCgkubmVlZHNfdHZhdWRpbwk9IDAsCgkudHVuZXJfdHlwZQk9IDQsCn0sewoJLm5hbWUJCT0gIkRpYW1vbmQgRFRWMjAwMCIsCgkudmlkZW9faW5wdXRzCT0gNCwKCS5hdWRpb19pbnB1dHMJPSAxLAoJLnR1bmVyCQk9IDAsCgkuc3ZocwkJPSAyLAoJLmdwaW9tYXNrCT0gMywKCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAwfSwKCS5hdWRpb211eAk9IHsgMCwgMSwgMCwgMSwgM30sCgkubmVlZHNfdHZhdWRpbwk9IDEsCgkudHVuZXJfdHlwZQk9IC0xLAp9LHsKCS5uYW1lCQk9ICJBVmVyTWVkaWEgVFZQaG9uZSIsCgkudmlkZW9faW5wdXRzCT0gMywKCS5hdWRpb19pbnB1dHMJPSAxLAoJLnR1bmVyCQk9IDAsCgkuc3ZocwkJPSAzLAoJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAoJLmdwaW9tYXNrCT0gMHgwZiwKCS5hdWRpb211eAk9IHsgMHgwYywgMHgwNCwgMHgwOCwgMHgwNCwgMH0sCgkvKiAgICAgICAgICAgICAgICAweDA0IGZvciBzb21lIGNhcmRzID8/ICovCgkubmVlZHNfdHZhdWRpbwk9IDEsCgkudHVuZXJfdHlwZQk9IC0xLAoJLmF1ZGlvX2hvb2sJPSBhdmVybWVkaWFfdHZwaG9uZV9hdWRpbywKCS5oYXNfcmVtb3RlICAgICA9IDEsCn0sewoJLm5hbWUJCT0gIk1BVFJJWC1WaXNpb24gTVYtRGVsdGEiLAoJLnZpZGVvX2lucHV0cwk9IDUsCgkuYXVkaW9faW5wdXRzCT0gMSwKCS50dW5lcgkJPSAtMSwKCS5zdmhzCQk9IDMsCgkuZ3Bpb21hc2sJPSAwLAoJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDAsIDB9LAoJLmF1ZGlvbXV4CT0gezAgfSwKCS5uZWVkc190dmF1ZGlvCT0gMSwKCS50dW5lcl90eXBlCT0gLTEsCn0sewoKLyogLS0tLSBjYXJkIDB4MDggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJLm5hbWUJCT0gIkxpZmV2aWV3IEZseVZpZGVvIElJIChCdDg0OCkgTFIyNiAvIE1BWEkgVFYgVmlkZW8gUENJMiBMUjI2IiwKCS52aWRlb19pbnB1dHMJPSA0LAoJLmF1ZGlvX2lucHV0cwk9IDEsCgkudHVuZXIJCT0gMCwKCS5zdmhzCQk9IDIsCgkuZ3Bpb21hc2sJPSAweGMwMCwKCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKCS5hdWRpb211eAk9IHsgMCwgMHhjMDAsIDB4ODAwLCAweDQwMCwgMHhjMDAsIDB9LAoJLm5lZWRzX3R2YXVkaW8JPSAxLAoJLnBsbAkJPSBQTExfMjgsCgkudHVuZXJfdHlwZQk9IC0xLAp9LHsKCS5uYW1lCQk9ICJJTVMvSVhtaWNybyBUdXJib1RWIiwKCS52aWRlb19pbnB1dHMJPSAzLAoJLmF1ZGlvX2lucHV0cwk9IDEsCgkudHVuZXIJCT0gMCwKCS5zdmhzCQk9IDIsCgkuZ3Bpb21hc2sJPSAzLAoJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAoJLmF1ZGlvbXV4CT0geyAxLCAxLCAyLCAzLCAwfSwKCS5uZWVkc190dmF1ZGlvCT0gMCwKCS5wbGwJCT0gUExMXzI4LAoJLnR1bmVyX3R5cGUJPSBUVU5FUl9URU1JQ19QQUwsCn0sewoJLm5hbWUJCT0gIkhhdXBwYXVnZSAoYnQ4NzgpIiwKCS52aWRlb19pbnB1dHMJPSA0LAoJLmF1ZGlvX2lucHV0cwk9IDEsCgkudHVuZXIJCT0gMCwKCS5zdmhzCQk9IDIsCgkuZ3Bpb21hc2sJPSAweDBmLCAvKiBvbGQ6IDcgKi8KCS5tdXhzZWwJCT0geyAyLCAwLCAxLCAxfSwKCS5hdWRpb211eAk9IHsgMCwgMSwgMiwgMywgNH0sCgkubmVlZHNfdHZhdWRpbwk9IDEsCgkucGxsCQk9IFBMTF8yOCwKCS50dW5lcl90eXBlCT0gLTEsCn0sewoJLm5hbWUJCT0gIk1JUk8gUENUViBwcm8iLAoJLnZpZGVvX2lucHV0cwk9IDMsCgkuYXVkaW9faW5wdXRzCT0gMSwKCS50dW5lcgkJPSAwLAoJLnN2aHMJCT0gMiwKCS5ncGlvbWFzawk9IDB4MzAxNGYsCgkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sCgkuYXVkaW9tdXgJPSB7IDB4MjAwMDEsMHgxMDAwMSwgMCwgMCwxMH0sCgkubmVlZHNfdHZhdWRpbwk9IDEsCgkudHVuZXJfdHlwZQk9IC0xLAp9LHsKCi8qIC0tLS0gY2FyZCAweDBjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCS5uYW1lCQk9ICJBRFMgVGVjaG5vbG9naWVzIENoYW5uZWwgU3VyZmVyIFRWIChidDg0OCkiLAoJLnZpZGVvX2lucHV0cwk9IDMsCgkuYXVkaW9faW5wdXRzCT0gMSwKCS50dW5lcgkJPSAwLAoJLnN2aHMJCT0gMiwKCS5ncGlvbWFzawk9IDE1LAoJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAoJLmF1ZGlvbXV4CT0geyAxMywgMTQsIDExLCA3LCAwLCAwfSwKCS5uZWVkc190dmF1ZGlvCT0gMSwKCS50dW5lcl90eXBlCT0gLTEsCn0sewoJLm5hbWUJCT0gIkFWZXJNZWRpYSBUVkNhcHR1cmUgOTgiLAoJLnZpZGVvX2lucHV0cwk9IDMsCgkuYXVkaW9faW5wdXRzCT0gNCwKCS50dW5lcgkJPSAwLAoJLnN2aHMJCT0gMiwKCS5ncGlvbWFzawk9IDE1LAoJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAoJLmF1ZGlvbXV4CT0geyAxMywgMTQsIDExLCA3LCAwLCAwfSwKCS5uZWVkc190dmF1ZGlvCT0gMSwKCS5tc3AzNHh4X2FsdCAgICA9IDEsCgkucGxsCQk9IFBMTF8yOCwKCS50dW5lcl90eXBlCT0gVFVORVJfUEhJTElQU19QQUwsCgkuYXVkaW9faG9vayAgICAgPSBhdmVybWVkaWFfdHZfc3RlcmVvX2F1ZGlvLAp9LHsKCS5uYW1lCQk9ICJBaW1zbGFiIFZpZGVvIEhpZ2h3YXkgWHRyZW1lIChWSFgpIiwKCS52aWRlb19pbnB1dHMJPSAzLAoJLmF1ZGlvX2lucHV0cwk9IDEsCgkudHVuZXIJCT0gMCwKCS5zdmhzCQk9IDIsCgkuZ3Bpb21hc2sJPSA3LAoJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAoJLmF1ZGlvbXV4CT0geyAwLCAyLCAxLCAzLCA0fSwgLyogb2xkOiB7IDAsIDEsIDIsIDMsIDR9ICovCgkubmVlZHNfdHZhdWRpbwk9IDEsCgkucGxsCQk9IFBMTF8yOCwKCS50dW5lcl90eXBlCT0gLTEsCn0sewoJLm5hbWUJCT0gIlpvbHRyaXggVFYtTWF4IiwKCS52aWRlb19pbnB1dHMJPSAzLAoJLmF1ZGlvX2lucHV0cwk9IDEsCgkudHVuZXIJCT0gMCwKCS5zdmhzCQk9IDIsCgkuZ3Bpb21hc2sJPSAxNSwKCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKCS5hdWRpb211eAk9IHswICwgMCwgMSAsIDAsIDEwfSwKCS5uZWVkc190dmF1ZGlvCT0gMSwKCS50dW5lcl90eXBlCT0gLTEsCn0sewoKLyogLS0tLSBjYXJkIDB4MTAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJLm5hbWUJCT0gIlByb2xpbmsgUGl4ZWx2aWV3IFBsYXlUViAoYnQ4NzgpIiwKCS52aWRlb19pbnB1dHMJPSAzLAoJLmF1ZGlvX2lucHV0cwk9IDEsCgkudHVuZXIJCT0gMCwKCS5zdmhzCQk9IDIsCgkuZ3Bpb21hc2sJPSAweDAxZmUwMCwKCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKI2lmIDAKCS8vIG9sZAoJLmF1ZGlvbXV4CT0geyAweDAxYzAwMCwgMCwgMHgwMTgwMDAsIDB4MDE0MDAwLCAweDAwMjAwMCwgMCB9LAojZWxzZQoJLy8gMjAwMy0xMC0yMCBieSAiQW50b24gQS4gQXJhcG92IiA8YXJhcG92QG1haWwucnU+CgkuYXVkaW9tdXggICAgICAgPSB7IDB4MDAxZTAwLCAwLCAweDAxODAwMCwgMHgwMTQwMDAsIDB4MDAyMDAwLCAwIH0sCiNlbmRpZgoJLm5lZWRzX3R2YXVkaW8JPSAxLAoJLnBsbAkJPSBQTExfMjgsCgkudHVuZXJfdHlwZQk9IC0xLAp9LHsKCS5uYW1lCQk9ICJMZWFkdGVrIFdpblZpZXcgNjAxIiwKCS52aWRlb19pbnB1dHMJPSAzLAoJLmF1ZGlvX2lucHV0cwk9IDEsCgkudHVuZXIJCT0gMCwKCS5zdmhzCQk9IDIsCgkuZ3Bpb21hc2sJPSAweDgzMDBmOCwKCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxLDB9LAoJLmF1ZGlvbXV4CT0geyAweDRmYTAwNywweGNmYTAwNywweGNmYTAwNywweGNmYTAwNywweGNmYTAwNywweGNmYTAwN30sCgkubmVlZHNfdHZhdWRpbwk9IDEsCgkudHVuZXJfdHlwZQk9IC0xLAoJLmF1ZGlvX2hvb2sJPSB3aW52aWV3X2F1ZGlvLAoJLmhhc19yYWRpbwk9IDEsCn0sewoJLm5hbWUJCT0gIkFWRUMgSW50ZXJjYXB0dXJlIiwKCS52aWRlb19pbnB1dHMJPSAzLAoJLmF1ZGlvX2lucHV0cwk9IDIsCgkudHVuZXIJCT0gMCwKCS5zdmhzCQk9IDIsCgkuZ3Bpb21hc2sJPSAwLAoJLm11eHNlbAkJPSB7MiwgMywgMSwgMX0sCgkuYXVkaW9tdXgJPSB7MSwgMCwgMCwgMCwgMH0sCgkubmVlZHNfdHZhdWRpbwk9IDEsCgkudHVuZXJfdHlwZQk9IC0xLAp9LHsKCS5uYW1lCQk9ICJMaWZldmlldyBGbHlWaWRlbyBJSSBFWiAvRmx5S2l0IExSMzggQnQ4NDggKGNhcHR1cmUgb25seSkiLAoJLnZpZGVvX2lucHV0cwk9IDQsCgkuYXVkaW9faW5wdXRzCT0gMSwKCS50dW5lcgkJPSAtMSwKCS5zdmhzCQk9IC0xLAoJLmdwaW9tYXNrCT0gMHg4ZGZmMDAsCgkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sCgkuYXVkaW9tdXgJPSB7IDAgfSwKCS5ub19tc3AzNHh4CT0gMSwKCS50dW5lcl90eXBlCT0gLTEsCn0sewoKLyogLS0tLSBjYXJkIDB4MTQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJLm5hbWUJCT0gIkNFSSBSYWZmbGVzIENhcmQiLAoJLnZpZGVvX2lucHV0cwk9IDMsCgkuYXVkaW9faW5wdXRzCT0gMywKCS50dW5lcgkJPSAwLAoJLnN2aHMJCT0gMiwKCS5tdXhzZWwJCT0gezIsIDMsIDEsIDF9LAoJLnR1bmVyX3R5cGUJPSAtMSwKfSx7CgkubmFtZQkJPSAiTGlmZXZpZXcgRmx5VmlkZW8gOTgvIEx1Y2t5IFN0YXIgSW1hZ2UgV29ybGQgQ29uZmVyZW5jZVRWIExSNTAiLAoJLnZpZGVvX2lucHV0cwk9IDQsCgkuYXVkaW9faW5wdXRzCT0gMiwgIC8vIHR1bmVyLCBsaW5lIGluCgkudHVuZXIJCT0gMCwKCS5zdmhzCQk9IDIsCgkuZ3Bpb21hc2sJPSAweDE4MDAsCgkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sCgkuYXVkaW9tdXgJPSB7IDAsIDB4ODAwLCAweDEwMDAsIDB4MTAwMCwgMHgxODAwfSwKCS5wbGwJCT0gUExMXzI4LAoJLnR1bmVyX3R5cGUJPSBUVU5FUl9QSElMSVBTX1BBTF9JLAp9LHsKCS5uYW1lCQk9ICJBc2tleSBDUEgwNTAvIFBob2ViZSBUdiBNYXN0ZXIgKyBGTSIsCgkudmlkZW9faW5wdXRzCT0gMywKCS5hdWRpb19pbnB1dHMJPSAxLAoJLnR1bmVyCQk9IDAsCgkuc3ZocwkJPSAyLAoJLmdwaW9tYXNrCT0gMHhjMDAsCgkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sCgkuYXVkaW9tdXgJPSB7MCwgMSwgMHg4MDAsIDB4NDAwLCAweGMwMCwgMH0sCgkubmVlZHNfdHZhdWRpbwk9IDEsCgkucGxsCQk9IFBMTF8yOCwKCS50dW5lcl90eXBlCT0gLTEsCn0sewoJLm5hbWUJCT0gIk1vZHVsYXIgVGVjaG5vbG9neSBNTTIwMS9NTTIwMi9NTTIwNS9NTTIxMC9NTTIxNSBQQ1RWLCBidDg3OCIsCgkudmlkZW9faW5wdXRzCT0gMywKCS5hdWRpb19pbnB1dHMJPSAxLAoJLnR1bmVyCQk9IDAsCgkuc3ZocwkJPSAtMSwKCS5ncGlvbWFzawk9IDcsCgkubXV4c2VsCQk9IHsgMiwgMywgLTEgfSwKICAgICAgICAuZGlnaXRhbF9tb2RlICAgPSBESUdJVEFMX01PREVfQ0FNRVJBLAoJLmF1ZGlvbXV4CT0geyAwLCAwLCAwLCAwLCAwIH0sCgkubm9fbXNwMzR4eAk9IDEsCgkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9BTFBTX1RTQkI1X1BBTF9JLAp9LHsKCi8qIC0tLS0gY2FyZCAweDE4IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCS5uYW1lCQk9ICJBc2tleSBDUEgwNVgvMDZYIChidDg3OCkgW21hbnkgdmVuZG9yc10iLAoJLnZpZGVvX2lucHV0cwk9IDMsCgkuYXVkaW9faW5wdXRzCT0gMSwKCS50dW5lcgkJPSAwLAoJLnN2aHMJCT0gMiwKCS5ncGlvbWFzawk9IDB4ZTAwLAoJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAoJLmF1ZGlvbXV4CT0gezB4NDAwLCAweDQwMCwgMHg0MDAsIDB4NDAwLCAweGMwMH0sCgkubmVlZHNfdHZhdWRpbwk9IDEsCgkucGxsCQk9IFBMTF8yOCwKCS50dW5lcl90eXBlCT0gLTEsCgkuaGFzX3JlbW90ZSAgICAgPSAxLAp9LHsKCS5uYW1lICAgICAgICAgICA9ICJUZXJyYXRlYyBUZXJyYVRWKyBWZXJzaW9uIDEuMCAoQnQ4NDgpLyBUZXJyYSBUVmFsdWUgVmVyc2lvbiAxLjAvIFZvYmlzIFRWLUJvb3N0YXIiLAoJLnZpZGVvX2lucHV0cwk9IDMsCgkuYXVkaW9faW5wdXRzCT0gMSwKCS50dW5lcgkJPSAwLAoJLnN2aHMJCT0gMiwKCS5ncGlvbWFzayAgICAgICA9IDB4MWYwZmZmLAoJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAoJLmF1ZGlvbXV4ICAgICAgID0geyAweDIwMDAwLCAweDMwMDAwLCAweDEwMDAwLCAwLCAweDQwMDAwfSwKCS5uZWVkc190dmF1ZGlvCT0gMCwKCS50dW5lcl90eXBlCT0gVFVORVJfUEhJTElQU19QQUwsCgkuYXVkaW9faG9vayAgICAgPSB0ZXJyYXR2X2F1ZGlvLAp9LHsKCS5uYW1lCQk9ICJIYXVwcGF1Z2UgV2luQ2FtIG5ld2VyIChidDg3OCkiLAoJLnZpZGVvX2lucHV0cwk9IDQsCgkuYXVkaW9faW5wdXRzCT0gMSwKCS50dW5lcgkJPSAwLAoJLnN2aHMJCT0gMywKCS5ncGlvbWFzawk9IDcsCgkubXV4c2VsCQk9IHsgMiwgMCwgMSwgMX0sCgkuYXVkaW9tdXgJPSB7IDAsIDEsIDIsIDMsIDR9LAoJLm5lZWRzX3R2YXVkaW8JPSAxLAoJLnR1bmVyX3R5cGUJPSAtMSwKfSx7CgkubmFtZQkJPSAiTGlmZXZpZXcgRmx5VmlkZW8gOTgvIE1BWEkgVFYgVmlkZW8gUENJMiBMUjUwIiwKCS52aWRlb19pbnB1dHMJPSA0LAoJLmF1ZGlvX2lucHV0cwk9IDIsCgkudHVuZXIJCT0gMCwKCS5zdmhzCQk9IDIsCgkuZ3Bpb21hc2sJPSAweDE4MDAsCgkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sCgkuYXVkaW9tdXgJPSB7IDAsIDB4ODAwLCAweDEwMDAsIDB4MTAwMCwgMHgxODAwfSwKCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCS50dW5lcl90eXBlCT0gVFVORVJfUEhJTElQU19TRUNBTSwKfSx7CgovKiAtLS0tIGNhcmQgMHgxYyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgkubmFtZSAgICAgICAgICAgPSAiVGVycmF0ZWMgVGVycmFUVisgVmVyc2lvbiAxLjEgKGJ0ODc4KSIsCgkudmlkZW9faW5wdXRzCT0gMywKCS5hdWRpb19pbnB1dHMJPSAxLAoJLnR1bmVyCQk9IDAsCgkuc3ZocwkJPSAyLAoJLmdwaW9tYXNrCT0gMHgxZjBmZmYsCgkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sCgkuYXVkaW9tdXgJPSB7IDB4MjAwMDAsIDB4MzAwMDAsIDB4MTAwMDAsIDB4MDAwMDAsIDB4NDAwMDB9LAoJLm5lZWRzX3R2YXVkaW8JPSAwLAoJLnR1bmVyX3R5cGUJPSBUVU5FUl9QSElMSVBTX1BBTCwKCS5hdWRpb19ob29rCT0gdGVycmF0dl9hdWRpbywKCS8qIEdQSU8gd2lyaW5nOgogICAgICAgICAgICAgICBFeHRlcm5hbCAyMCBwaW4gY29ubmVjdG9yIChmb3IgQWN0aXZlIFJhZGlvIFVwZ3JhZGUgYm9hcmQpCiAgICAgICAgICAgICAgIGdwaW8wMDogaTJjLXNkYQogICAgICAgICAgICAgICBncGlvMDE6IGkyYy1zY2wKICAgICAgICAgICAgICAgZ3BpbzAyOiBvbTU2MTAtZGF0YQogICAgICAgICAgICAgICBncGlvMDM6IG9tNTYxMC1jbGsKICAgICAgICAgICAgICAgZ3BpbzA0OiBvbTU2MTAtd3JlCiAgICAgICAgICAgICAgIGdwaW8wNTogb201NjEwLXN0ZXJlbwogICAgICAgICAgICAgICBncGlvMDY6IHJkczY1ODgtZGF2bgogICAgICAgICAgICAgICBncGlvMDc6IFBpbiA3IG4uYy4KICAgICAgICAgICAgICAgZ3BpbzA4OiBuSU9XCiAgICAgICAgICAgICAgIGdwaW8wOSsxMDogbklPUiwgblNFTCA/PyAoYnQ4NzgpCiAgICAgICAgICAgICAgICBncGlvMDk6IG5JT1IgKGJ0ODQ4KQogICAgICAgICAgICAgICAgZ3BpbzEwOiBuU0VMIChidDg0OCkKICAgICAgICAgICAgICBTb3VuZCBSb3V0aW5nOgogICAgICAgICAgICAgICBncGlvMTY6IHUyLUEwICgxc3QgNDA1MmJ0KQogICAgICAgICAgICAgICBncGlvMTc6IHUyLUExCiAgICAgICAgICAgICAgIGdwaW8xODogdTItbkVOCiAgICAgICAgICAgICAgIGdwaW8xOTogdTQtQTAgKDJuZCA0MDUyKQogICAgICAgICAgICAgICBncGlvMjA6IHU0LUExCiAgICAgICAgICAgICAgICAgICAgICAgdTQtbkVOIC0gR05ECgkgICAgQnRzcHk6CgkgIAkwMDAwMCA6IENkcm9tIChpbnRlcm5hbCBhdWRpbyBpbnB1dCkKCQkxMDAwMCA6IGV4dC4gVmlkZW8gYXVkaW8gaW5wdXQKCQkyMDAwMCA6IFRWIE1vbm8KCQlhMDAwMCA6IFRWIE1vbm8vMgoJICAgICAgIDFhMDAwMCA6IFRWIFN0ZXJlbwoJCTMwMDAwIDogUmFkaW8KCQk0MDAwMCA6IE11dGUKICAgICAgICovCgp9LHsKCS8qIEphbm5payBGcml0c2NoIDxqYW5uaWtAdGVjaGZhay51bmktYmllbGVmZWxkLmRlPiAqLwoJLm5hbWUJCT0gIkltYWdlbmF0aW9uIFBYQzIwMCIsCgkudmlkZW9faW5wdXRzCT0gNSwKCS5hdWRpb19pbnB1dHMJPSAxLAoJLnR1bmVyCQk9IC0xLAoJLnN2aHMJCT0gMSwgLyogd2FzOiA0ICovCgkuZ3Bpb21hc2sJPSAwLAoJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDAsIDB9LAoJLmF1ZGlvbXV4CT0geyAwIH0sCgkubmVlZHNfdHZhdWRpbwk9IDEsCgkudHVuZXJfdHlwZQk9IC0xLAoJLm11eHNlbF9ob29rICAgID0gUFhDMjAwX211eHNlbCwKCn0sewoJLm5hbWUJCT0gIkxpZmV2aWV3IEZseVZpZGVvIDk4IExSNTAiLAoJLnZpZGVvX2lucHV0cwk9IDQsCgkuYXVkaW9faW5wdXRzCT0gMSwKCS50dW5lcgkJPSAwLAoJLnN2aHMJCT0gMiwKCS5ncGlvbWFzawk9IDB4MTgwMCwgIC8vMHg4ZGZlMDAKCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKCS5hdWRpb211eAk9IHsgMCwgMHgwODAwLCAweDEwMDAsIDB4MTAwMCwgMHgxODAwLCAwIH0sCgkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkudHVuZXJfdHlwZQk9IC0xLAp9LHsKCS5uYW1lCQk9ICJGb3JtYWMgaVByb1RWLCBGb3JtYWMgUHJvVFYgSSAoYnQ4NDgpIiwKCS52aWRlb19pbnB1dHMJPSA0LAoJLmF1ZGlvX2lucHV0cwk9IDEsCgkudHVuZXIJCT0gMCwKCS5zdmhzCQk9IDMsCgkuZ3Bpb21hc2sJPSAxLAoJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAoJLmF1ZGlvbXV4CT0geyAxLCAwLCAwLCAwLCAwIH0sCgkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkudHVuZXJfdHlwZQk9IFRVTkVSX1BISUxJUFNfUEFMLAp9LHsKCi8qIC0tLS0gY2FyZCAweDIwIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCS5uYW1lCQk9ICJJbnRlbCBDcmVhdGUgYW5kIFNoYXJlIFBDSS8gU21hcnQgVmlkZW8gUmVjb3JkZXIgSUlJIiwKCS52aWRlb19pbnB1dHMJPSA0LAoJLmF1ZGlvX2lucHV0cwk9IDAsCgkudHVuZXIJCT0gLTEsCgkuc3ZocwkJPSAyLAoJLmdwaW9tYXNrCT0gMCwKCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKCS5hdWRpb211eAk9IHsgMCB9LAoJLm5lZWRzX3R2YXVkaW8JPSAwLAoJLnR1bmVyX3R5cGUJPSA0LAp9LHsKCS5uYW1lICAgICAgICAgICA9ICJUZXJyYXRlYyBUZXJyYVRWYWx1ZSBWZXJzaW9uIEJ0ODc4IiwKCS52aWRlb19pbnB1dHMJPSAzLAoJLmF1ZGlvX2lucHV0cwk9IDEsCgkudHVuZXIJCT0gMCwKCS5zdmhzCQk9IDIsCgkuZ3Bpb21hc2sJPSAweGZmZmYwMCwKCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKCS5hdWRpb211eAk9IHsgMHg1MDAsIDAsIDB4MzAwLCAweDkwMCwgMHg5MDB9LAoJLm5lZWRzX3R2YXVkaW8JPSAxLAoJLnBsbAkJPSBQTExfMjgsCgkudHVuZXJfdHlwZQk9IFRVTkVSX1BISUxJUFNfUEFMLAp9LHsKCS5uYW1lCQk9ICJMZWFkdGVrIFdpbkZhc3QgMjAwMC8gV2luRmFzdCAyMDAwIFhQIiwKCS52aWRlb19pbnB1dHMJPSA0LAoJLmF1ZGlvX2lucHV0cwk9IDEsCgkudHVuZXIJCT0gMCwKCS5zdmhzCQk9IDIsCgkubXV4c2VsCQk9IHsgMiwgMywgMSwgMSwgMH0sIC8vIFRWLCBDVmlkLCBTVmlkLCBDVmlkIG92ZXIgU1ZpZCBjb25uZWN0b3IKI2lmIDAKCS5ncGlvbWFzawk9IDB4YzMzMDAwLAoJLmF1ZGlvbXV4CT0geyAweDQyMjAwMCwweDEwMDAsMHgwMDAwLDB4NjIwMDAwLDB4ODAwMDAwIH0sCiNlbHNlCgkvKiBBbGV4YW5kZXIgVmFyYWtpbiA8YXZhcmFraW5AaG90bWFpbC5jb20+IFtzdGVyZW8gdmVyc2lvbl0gKi8KCS5ncGlvbWFzawk9IDB4YjMzMDAwLAoJLmF1ZGlvbXV4CT0geyAweDEyMjAwMCwweDEwMDAsMHgwMDAwLDB4NjIwMDAwLDB4ODAwMDAwIH0sCiNlbmRpZgoJLyogQXVkaW8gUm91dGluZyBmb3IgIldpbkZhc3QgMjAwMCBYUCIgKG5vIHR2IHN0ZXJlbyAhKQoJCWdwaW8yMyAtLSBoZWY0MDUyOm5FbmFibGUgKDB4ODAwMDAwKQoJCWdwaW8xMiAtLSBoZWY0MDUyOkExCgkgICAgICAgIGdwaW8xMyAtLSBoZWY0MDUyOkEwCgkgICAgMHgwMDAwOiBleHRlcm5hbCBhdWRpbwoJICAgIDB4MTAwMDogRk0KCSAgICAweDIwMDA6IFRWCgkgICAgMHgzMDAwOiBuLmMuCiAgICAgICAgICBOb3RlOiBUaGVyZSBleGlzdHMgYW5vdGhlciB2YXJpYW50ICJXaW5mYXN0IDIwMDAiIHdpdGggdHYgc3RlcmVvICE/CgkgIE5vdGU6IGVlcHJvbSBvbmx5IGNvbnRhaW5zIEZGIGFuZCBwY2kgc3Vic3lzdGVtIGlkIDEwN2Q6NjYwNgoJICovCgkubmVlZHNfdHZhdWRpbwk9IDAsCgkucGxsCQk9IFBMTF8yOCwKCS5oYXNfcmFkaW8JPSAxLAoJLnR1bmVyX3R5cGUJPSA1LCAvLyBkZWZhdWx0IGZvciBub3csIGdwaW8gcmVhZHMgQkZGRjA2IGZvciBQYWwgYmcrZGsKCS5hdWRpb19ob29rCT0gd2luZmFzdDIwMDBfYXVkaW8sCgkuaGFzX3JlbW90ZSAgICAgPSAxLAp9LHsKCS5uYW1lCQk9ICJMaWZldmlldyBGbHlWaWRlbyA5OCBMUjUwIC8gQ2hyb25vcyBWaWRlbyBTaHV0dGxlIElJIiwKCS52aWRlb19pbnB1dHMJPSA0LAoJLmF1ZGlvX2lucHV0cwk9IDMsCgkudHVuZXIJCT0gMCwKCS5zdmhzCQk9IDIsCgkuZ3Bpb21hc2sJPSAweDE4MDAsCgkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sCgkuYXVkaW9tdXgJPSB7IDAsIDB4ODAwLCAweDEwMDAsIDB4MTAwMCwgMHgxODAwfSwKCS5wbGwJCT0gUExMXzI4LAoJLnR1bmVyX3R5cGUJPSAtMSwKfSx7CgovKiAtLS0tIGNhcmQgMHgyNCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgkubmFtZQkJPSAiTGlmZXZpZXcgRmx5VmlkZW8gOThGTSBMUjUwIC8gVHlwaG9vbiBUVmlldyBUVi9GTSBUdW5lciIsCgkudmlkZW9faW5wdXRzCT0gNCwKCS5hdWRpb19pbnB1dHMJPSAzLAoJLnR1bmVyCQk9IDAsCgkuc3ZocwkJPSAyLAoJLmdwaW9tYXNrCT0gMHgxODAwLAoJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAoJLmF1ZGlvbXV4CT0geyAwLCAweDgwMCwgMHgxMDAwLCAweDEwMDAsIDB4MTgwMCwgMCB9LAoJLnBsbAkJPSBQTExfMjgsCgkudHVuZXJfdHlwZQk9IC0xLAoJLmhhc19yYWRpbwk9IDEsCn0sewoJLm5hbWUJCT0gIlByb2xpbmsgUGl4ZWxWaWV3IFBsYXlUViBwcm8iLAoJLnZpZGVvX2lucHV0cwk9IDMsCgkuYXVkaW9faW5wdXRzCT0gMSwKCS50dW5lcgkJPSAwLAoJLnN2aHMJCT0gMiwKCS5ncGlvbWFzawk9IDB4ZmYsCgkubXV4c2VsCQk9IHsgMiwgMywgMSwgMSB9LAoJLmF1ZGlvbXV4CT0geyAweDIxLCAweDIwLCAweDI0LCAweDJjLCAweDI5LCAweDI5IH0sCgkubm9fbXNwMzR4eAk9IDEsCgkucGxsCQk9IFBMTF8yOCwKCS50dW5lcl90eXBlCT0gLTEsCn0sewoJLm5hbWUJCT0gIkFza2V5IENQSDA2WCBUVmlldzk5IiwKCS52aWRlb19pbnB1dHMJPSA0LAoJLmF1ZGlvX2lucHV0cwk9IDEsCgkudHVuZXIJCT0gMCwKCS5zdmhzCQk9IDIsCgkuZ3Bpb21hc2sJPSAweDU1MWUwMCwKCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAwfSwKCS5hdWRpb211eAk9IHsgMHg1NTE0MDAsIDB4NTUxMjAwLCAwLCAwLCAweDU1MWMwMCwgMHg1NTEyMDAgfSwKCS5uZWVkc190dmF1ZGlvCT0gMSwKCS5wbGwJCT0gUExMXzI4LAoJLnR1bmVyX3R5cGUJPSAxLAoJLmhhc19yZW1vdGUgICAgID0gMSwKfSx7CgkubmFtZQkJPSAiUGlubmFjbGUgUENUViBTdHVkaW8vUmF2ZSIsCgkudmlkZW9faW5wdXRzCT0gMywKCS5hdWRpb19pbnB1dHMJPSAxLAoJLnR1bmVyCQk9IDAsCgkuc3ZocwkJPSAyLAoJLmdwaW9tYXNrCT0gMHgwMzAwMEYsCgkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sCgkuYXVkaW9tdXgJPSB7IDIsIDB4ZDAwMDEsIDAsIDAsIDF9LAoJLm5lZWRzX3R2YXVkaW8JPSAwLAoJLnBsbAkJPSBQTExfMjgsCgkudHVuZXJfdHlwZQk9IC0xLAp9LHsKCi8qIC0tLS0gY2FyZCAweDI4IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCS5uYW1lCQk9ICJTVEIgVFYgUENJIEZNLCBHYXRld2F5IFAvTiA2MDAwNzA0IChidDg3OCksIDNEZnggVm9vZG9vVFYgMTAwIiwKCS52aWRlb19pbnB1dHMJPSAzLAoJLmF1ZGlvX2lucHV0cwk9IDEsCgkudHVuZXIJCT0gMCwKCS5zdmhzCQk9IDIsCgkuZ3Bpb21hc2sJPSA3LAoJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAoJLmF1ZGlvbXV4CT0geyA0LCAwLCAyLCAzLCAxfSwKCS5ub19tc3AzNHh4CT0gMSwKCS5uZWVkc190dmF1ZGlvCT0gMSwKCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfTlRTQywKCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCS5oYXNfcmFkaW8gICAgICA9IDEsCn0sewoJLm5hbWUJCT0gIkFWZXJNZWRpYSBUVlBob25lIDk4IiwKCS52aWRlb19pbnB1dHMJPSAzLAoJLmF1ZGlvX2lucHV0cwk9IDQsCgkudHVuZXIJCT0gMCwKCS5zdmhzCQk9IDIsCgkuZ3Bpb21hc2sJPSAxNSwKCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKCS5hdWRpb211eAk9IHsgMTMsIDQsIDExLCA3LCAwLCAwfSwKCS5uZWVkc190dmF1ZGlvCT0gMSwKCS5wbGwJCT0gUExMXzI4LAoJLnR1bmVyX3R5cGUJPSAtMSwKCS5oYXNfcmFkaW8JPSAxLAoJLmF1ZGlvX2hvb2sJPSBhdmVybWVkaWFfdHZwaG9uZV9hdWRpbywKfSx7CgkubmFtZQkJPSAiUHJvVmlkZW8gUFY5NTEiLCAvKiBwaWMxNmM1NCAqLwoJLnZpZGVvX2lucHV0cwk9IDMsCgkuYXVkaW9faW5wdXRzCT0gMSwKCS50dW5lcgkJPSAwLAoJLnN2aHMJCT0gMiwKCS5ncGlvbWFzawk9IDAsCgkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sCgkuYXVkaW9tdXgJPSB7IDAsIDAsIDAsIDAsIDB9LAoJLm5lZWRzX3R2YXVkaW8JPSAxLAoJLm5vX21zcDM0eHgJPSAxLAoJLnBsbAkJPSBQTExfMjgsCgkudHVuZXJfdHlwZQk9IDEsCn0sewoJLm5hbWUJCT0gIkxpdHRsZSBPbkFpciBUViIsCgkudmlkZW9faW5wdXRzCT0gMywKCS5hdWRpb19pbnB1dHMJPSAxLAoJLnR1bmVyCQk9IDAsCgkuc3ZocwkJPSAyLAoJLmdwaW9tYXNrCT0gMHhlMDBiLAoJLm11eHNlbAkJPSB7MiwgMywgMSwgMX0sCgkuYXVkaW9tdXgJPSB7MHhmZjlmZjYsIDB4ZmY5ZmY2LCAweGZmMWZmNywgMCwgMHhmZjNmZmN9LAoJLm5vX21zcDM0eHgJPSAxLAoJLnR1bmVyX3R5cGUJPSAtMSwKfSx7CgovKiAtLS0tIGNhcmQgMHgyYyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgkubmFtZQkJPSAiU2lnbWEgVFZJSS1GTSIsCgkudmlkZW9faW5wdXRzCT0gMiwKCS5hdWRpb19pbnB1dHMJPSAxLAoJLnR1bmVyCQk9IDAsCgkuc3ZocwkJPSAtMSwKCS5ncGlvbWFzawk9IDMsCgkubXV4c2VsCQk9IHsyLCAzLCAxLCAxfSwKCS5hdWRpb211eAk9IHsxLCAxLCAwLCAyLCAzfSwKCS5ub19tc3AzNHh4CT0gMSwKCS5wbGwJCT0gUExMX05PTkUsCgkudHVuZXJfdHlwZQk9IC0xLAp9LHsKCS5uYW1lCQk9ICJNQVRSSVgtVmlzaW9uIE1WLURlbHRhIDIiLAoJLnZpZGVvX2lucHV0cwk9IDUsCgkuYXVkaW9faW5wdXRzCT0gMSwKCS50dW5lcgkJPSAtMSwKCS5zdmhzCQk9IDMsCgkuZ3Bpb21hc2sJPSAwLAoJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDAsIDB9LAoJLmF1ZGlvbXV4CT0gezAgfSwKCS5ub19tc3AzNHh4CT0gMSwKCS5wbGwJCT0gUExMXzI4LAoJLnR1bmVyX3R5cGUJPSAtMSwKfSx7CgkubmFtZQkJPSAiWm9sdHJpeCBHZW5pZSBUVi9GTSIsCgkudmlkZW9faW5wdXRzCT0gMywKCS5hdWRpb19pbnB1dHMJPSAxLAoJLnR1bmVyCQk9IDAsCgkuc3ZocwkJPSAyLAoJLmdwaW9tYXNrCT0gMHhiY2YwM2YsCgkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sCgkuYXVkaW9tdXgJPSB7IDB4YmM4MDNmLCAweGJjOTAzZiwgMHhiY2IwM2YsIDAsIDB4YmNiMDNmfSwKCS5ub19tc3AzNHh4CT0gMSwKCS5wbGwJCT0gUExMXzI4LAoJLnR1bmVyX3R5cGUJPSAyMSwKfSx7CgkubmFtZQkJPSAiVGVycmF0ZWMgVFYvUmFkaW8rIiwKCS52aWRlb19pbnB1dHMJPSAzLAoJLmF1ZGlvX2lucHV0cwk9IDEsCgkudHVuZXIJCT0gMCwKCS5zdmhzCQk9IDIsCgkuZ3Bpb21hc2sJPSAweDcwMDAwLAoJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAoJLmF1ZGlvbXV4CT0geyAweDIwMDAwLCAweDMwMDAwLCAweDEwMDAwLCAwLCAweDQwMDAwLCAweDIwMDAwIH0sCgkubmVlZHNfdHZhdWRpbwk9IDEsCgkubm9fbXNwMzR4eAk9IDEsCgkucGxsCQk9IFBMTF8zNSwKCS50dW5lcl90eXBlCT0gMSwKCS5oYXNfcmFkaW8JPSAxLAp9LHsKCi8qIC0tLS0gY2FyZCAweDMwIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCS5uYW1lCQk9ICJBc2tleSBDUEgwM3gvIER5bmFsaW5rIE1hZ2ljIFRWaWV3IiwKCS52aWRlb19pbnB1dHMJPSAzLAoJLmF1ZGlvX2lucHV0cwk9IDEsCgkudHVuZXIJCT0gMCwKCS5zdmhzCQk9IDIsCgkuZ3Bpb21hc2sJPSAxNSwKCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKCS5hdWRpb211eAk9IHsyLDAsMCwwLDF9LAoJLm5lZWRzX3R2YXVkaW8JPSAxLAoJLnBsbAkJPSBQTExfMjgsCgkudHVuZXJfdHlwZQk9IC0xLAp9LHsKCS5uYW1lCQk9ICJJT0RBVEEgR1YtQkNUVjMvUENJIiwKCS52aWRlb19pbnB1dHMJPSAzLAoJLmF1ZGlvX2lucHV0cwk9IDEsCgkudHVuZXIJCT0gMCwKCS5zdmhzCQk9IDIsCgkuZ3Bpb21hc2sJPSAweDAxMGYwMCwKCS5tdXhzZWwJCT0gezIsIDMsIDAsIDB9LAoJLmF1ZGlvbXV4CT0gezB4MTAwMDAsIDAsIDB4MTAwMDAsIDAsIDAsIDB9LAoJLm5vX21zcDM0eHgJPSAxLAoJLnBsbAkJPSBQTExfMjgsCgkudHVuZXJfdHlwZQk9IFRVTkVSX0FMUFNfVFNIQzZfTlRTQywKCS5hdWRpb19ob29rCT0gZ3ZiY3R2M3BjaV9hdWRpbywKfSx7CgkubmFtZQkJPSAiUHJvbGluayBQVi1CVDg3OFArNEUgLyBQaXhlbFZpZXcgUGxheVRWIFBBSyAvIExlbmNvIE1YVFYtOTU3OCBDUCIsCgkudmlkZW9faW5wdXRzCT0gNSwKCS5hdWRpb19pbnB1dHMJPSAxLAoJLnR1bmVyCQk9IDAsCgkuc3ZocwkJPSAzLAoJLmdwaW9tYXNrCT0gMHhBQTAwMDAsCgkubXV4c2VsCQk9IHsgMiwzLDEsMSwtMSB9LAoJLmRpZ2l0YWxfbW9kZSAgID0gRElHSVRBTF9NT0RFX0NBTUVSQSwKCS5hdWRpb211eAk9IHsgMHgyMDAwMCwgMCwgMHg4MDAwMCwgMHg4MDAwMCwgMHhhODAwMCwgMHg0NjAwMCAgfSwKCS5ub19tc3AzNHh4CT0gMSwKCS5wbGwJCT0gUExMXzI4LAoJLnR1bmVyX3R5cGUJPSBUVU5FUl9QSElMSVBTX1BBTF9JLAoJLmhhc19yZW1vdGUJPSAxLAoJLyogR1BJTyB3aXJpbmc6IChkaWZmZXJlbnQgZnJvbSBSZXYuNEMgISkKCQlHUElPMTc6IFU0LkEwIChmaXJzdCBoZWY0MDUyYnQpCgkJR1BJTzE5OiBVNC5BMQoJCUdQSU8yMDogVTUuQTEgKHNlY29uZCBoZWY0MDUyYnQpCgkJR1BJTzIxOiBVNC5uRU4KCQlHUElPMjI6IEJUODMyIFJlc2V0IExpbmUKCQlHUElPMjM6IEE1LEEwLCBVNSxuRU4KCSAgIE5vdGU6IEF0IGkyYz0weDhhIGlzIGEgQnQ4MzIgY2hpcCwgd2hpY2ggY2hhbmdlcyB0byAweDg4IGFmdGVyIGJlaW5nIHJlc2V0IHZpYSBHUElPMjIKCSAqLwp9LHsKCS5uYW1lICAgICAgICAgICA9ICJFYWdsZSBXaXJlbGVzcyBDYXByaWNvcm4yIChidDg3OEEpIiwKCS52aWRlb19pbnB1dHMgICA9IDQsCgkuYXVkaW9faW5wdXRzICAgPSAxLAoJLnR1bmVyICAgICAgICAgID0gMCwKCS5zdmhzICAgICAgICAgICA9IDIsCgkuZ3Bpb21hc2sgICAgICAgPSA3LAoJLm11eHNlbCAgICAgICAgID0geyAyLCAwLCAxLCAxfSwKCS5hdWRpb211eCAgICAgICA9IHsgMCwgMSwgMiwgMywgNH0sCgkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkudHVuZXJfdHlwZSAgICAgPSAtMSAvKiBUVU5FUl9BTFBTX1RNREgyX05UU0MgKi8sCn0sewoKLyogLS0tLSBjYXJkIDB4MzQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJLyogRGF2aWQgSORyZGVtYW4gPGRhdmlkQDJnZW4uY29tPiAqLwoJLm5hbWUgICAgICAgICAgID0gIlBpbm5hY2xlIFBDVFYgU3R1ZGlvIFBybyIsCgkudmlkZW9faW5wdXRzICAgPSA0LAoJLmF1ZGlvX2lucHV0cyAgID0gMSwKCS50dW5lciAgICAgICAgICA9IDAsCgkuc3ZocyAgICAgICAgICAgPSAzLAoJLmdwaW9tYXNrICAgICAgID0gMHgwMzAwMEYsCgkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sCgkuYXVkaW9tdXgJPSB7IDEsIDB4ZDAwMDEsIDAsIDAsIDEwfSwKCQkJLyogc291bmQgcGF0aCAoNSBzb3VyY2VzKToKCQkJICAgTVVYMSAobWFzayAweDAzKSwgRW5hYmxlIFBpbiAweDA4ICgwPWVuYWJsZSwgMT1kaXNhYmxlKQoJCQkJMD0gZXh0LiBBdWRpbyBJTgoJCQkJMT0gZnJvbSBNVVgyCgkJCQkyPSBNb25vIFRWIHNvdW5kIGZyb20gVHVuZXIKCQkJCTM9IG5vdCBjb25uZWN0ZWQKCQkJICAgTVVYMiAobWFzayAweDMwMDAwKToKCQkJCTAsMiwzPSBmcm9tIE1TUDM0eHgKCQkJCTE9IEZNIHN0ZXJlbyBSYWRpbyBmcm9tIFR1bmVyICovCgkubmVlZHNfdHZhdWRpbyAgPSAwLAoJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJLnR1bmVyX3R5cGUgICAgID0gLTEsCn0sewoJLyogQ2xhYXMgTGFuZ2JlaG4gPGNsYWFzQGJpZ2Zvb3QuY29tPiwKCSAgIFN2ZW4gR3JvdGhrbGFncyA8c3ZlbkB1cGIuZGU+ICovCgkubmFtZQkJPSAiVHlwaG9vbiBUVmlldyBSRFMgKyBGTSBTdGVyZW8gLyBLTkMxIFRWIFN0YXRpb24gUkRTIiwKCS52aWRlb19pbnB1dHMJPSA0LAoJLmF1ZGlvX2lucHV0cwk9IDMsCgkudHVuZXIJCT0gMCwKCS5zdmhzCQk9IDIsCgkuZ3Bpb21hc2sJPSAweDFjLAoJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAoJLmF1ZGlvbXV4CT0geyAwLCAwLCAweDEwLCA4LCA0IH0sCgkubmVlZHNfdHZhdWRpbwk9IDEsCgkucGxsCQk9IFBMTF8yOCwKCS50dW5lcl90eXBlCT0gVFVORVJfUEhJTElQU19QQUwsCgkuaGFzX3JhZGlvCT0gMSwKfSx7CgkvKiBUaW0gUvZzdGVybXVuZHQgPHJvc3Rlcm1AdW5pLW11ZW5zdGVyLmRlPgoJICAgaW4gZGUuY29tcC5vcy51bml4LmxpbnV4LmhhcmR3YXJlOgoJCW9wdGlvbnMgYnR0diBjYXJkPTAgcGxsPTEgcmFkaW89MSBncGlvbWFzaz0weDE4ZTAKCQlhdWRpb211eD0weDQ0YzcxZiwweDQ0ZDcxZiwwLDB4NDRkNzFmLDB4NDRkZmZmCgkJb3B0aW9ucyB0dW5lciB0eXBlPTUgKi8KCS5uYW1lCQk9ICJMaWZldmlldyBGbHlWaWRlbyAyMDAwIC9GbHlWaWRlbyBBMi8gTGlmZXRlYyBMVCA5NDE1IFRWIFtMUjkwXSIsCgkudmlkZW9faW5wdXRzCT0gNCwKCS5hdWRpb19pbnB1dHMJPSAxLAoJLnR1bmVyCQk9IDAsCgkuc3ZocwkJPSAyLAoJLmdwaW9tYXNrCT0gMHgxOGUwLAoJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAoJLmF1ZGlvbXV4CT0geyAweDAwMDAsMHgwODAwLDB4MTAwMCwweDEwMDAsMHgxOGUwIH0sCgkJICAgICAgIC8qIEZvciBjYXJkcyB3aXRoIHRkYTk4MjAvdGRhOTgyMToKCQkJICAweDAwMDA6IFR1bmVyIG5vcm1hbCBzdGVyZW8KCQkJICAweDAwODA6IFR1bmVyIEEyIFNBUCAoc2Vjb25kIGF1ZGlvIHByb2dyYW0gPSBad2Vpa2FuYWx0b24pCgkJCSAgMHgwODgwOiBUdW5lciBBMiBzdGVyZW8gKi8KCS5wbGwJCT0gUExMXzI4LAoJLnR1bmVyX3R5cGUJPSAtMSwKfSx7CgkvKiBNaWd1ZWwgQW5nZWwgQWx2YXJleiA8bWFhY3J1ekBuYXZlZ2FsaWEuY29tPgoJICAgb2xkIEVhc3kgVFYgQlQ4NDggdmVyc2lvbiAobW9kZWwgQ1BIMDMxKSAqLwoJLm5hbWUgICAgICAgICAgID0gIkFza2V5IENQSDAzMS8gQkVTVEJVWSBFYXN5IFRWIiwKCS52aWRlb19pbnB1dHMJPSA0LAoJLmF1ZGlvX2lucHV0cyAgID0gMSwKCS50dW5lciAgICAgICAgICA9IDAsCgkuc3ZocyAgICAgICAgICAgPSAyLAoJLmdwaW9tYXNrICAgICAgID0gMHhGLAoJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAwfSwKCS5hdWRpb211eCAgICAgICA9IHsgMiwgMCwgMCwgMCwgMTB9LAoJLm5lZWRzX3R2YXVkaW8gID0gMCwKCS5wbGwJCT0gUExMXzI4LAoJLnR1bmVyX3R5cGUJPSBUVU5FUl9URU1JQ19QQUwsCn0sewoKLyogLS0tLSBjYXJkIDB4MzggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJLyogR29yZG9uIEhleWRvbiA8Z2poZXlkb25AYmlnZm9vdC5jb20gKCc5OCkgKi8KCS5uYW1lICAgICAgICAgICA9ICJMaWZldmlldyBGbHlWaWRlbyA5OEZNIExSNTAiLAoJLnZpZGVvX2lucHV0cyAgID0gNCwKCS5hdWRpb19pbnB1dHMgICA9IDMsCgkudHVuZXIgICAgICAgICAgPSAwLAoJLnN2aHMgICAgICAgICAgID0gMiwKCS5ncGlvbWFzayAgICAgICA9IDB4MTgwMCwKCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMX0sCgkuYXVkaW9tdXggICAgICAgPSB7IDAsIDB4ODAwLCAweDEwMDAsIDB4MTAwMCwgMHgxODAwLCAwIH0sCgkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkudHVuZXJfdHlwZSAgICAgPSA1LAp9LHsKCS8qIFRoaXMgaXMgdGhlIHVsdGltYXRlIGNoZWFwbyBjYXB0dXJlIGNhcmQKCSAqIGp1c3QgYSBCVDg0OEEgb24gYSBzbWFsbCBQQ0IhCgkgKiBTdGV2ZSBIb3Nnb29kIDxzdGV2ZUBlcXVpaW5ldC5jb20+ICovCgkubmFtZSAgICAgICAgICAgPSAiR3JhbmRUZWMgJ0dyYW5kIFZpZGVvIENhcHR1cmUnIChCdDg0OCkiLAoJLnZpZGVvX2lucHV0cyAgID0gMiwKCS5hdWRpb19pbnB1dHMgICA9IDAsCgkudHVuZXIgICAgICAgICAgPSAtMSwKCS5zdmhzICAgICAgICAgICA9IDEsCgkuZ3Bpb21hc2sgICAgICAgPSAwLAoJLm11eHNlbCAgICAgICAgID0geyAzLCAxIH0sCgkuYXVkaW9tdXggICAgICAgPSB7IDAgfSwKCS5uZWVkc190dmF1ZGlvICA9IDAsCgkubm9fbXNwMzR4eCAgICAgPSAxLAoJLnBsbCAgICAgICAgICAgID0gUExMXzM1LAoJLnR1bmVyX3R5cGUgICAgID0gLTEsCn0sewogICAgICAgIC8qIERhbmllbCBIZXJyaW5ndG9uIDxkYW5pZWwuaGVycmluZ3RvbkBob21lLmNvbT4gKi8KICAgICAgICAubmFtZSAgICAgICAgICAgPSAiQXNrZXkgQ1BIMDYwLyBQaG9lYmUgVFYgTWFzdGVyIE9ubHkgKE5vIEZNKSIsCiAgICAgICAgLnZpZGVvX2lucHV0cyAgID0gMywKICAgICAgICAuYXVkaW9faW5wdXRzICAgPSAxLAogICAgICAgIC50dW5lciAgICAgICAgICA9IDAsCiAgICAgICAgLnN2aHMgICAgICAgICAgID0gMiwKICAgICAgICAuZ3Bpb21hc2sgICAgICAgPSAweGUwMCwKICAgICAgICAubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDF9LAogICAgICAgIC5hdWRpb211eCAgICAgICA9IHsgMHg0MDAsIDB4NDAwLCAweDQwMCwgMHg0MDAsIDB4ODAwLCAweDQwMCB9LAogICAgICAgIC5uZWVkc190dmF1ZGlvICA9IDEsCiAgICAgICAgLnBsbCAgICAgICAgICAgID0gUExMXzI4LAogICAgICAgIC50dW5lcl90eXBlICAgICA9IFRVTkVSX1RFTUlDXzQwMzZGWTVfTlRTQywKfSx7CgkvKiBNYXR0aSBNb3R0dXMgPG1vdHR1c0BwaHlzaWMudXQuZWU+ICovCgkubmFtZQkJPSAiQXNrZXkgQ1BIMDN4IFRWIENhcHR1cmVyIiwKCS52aWRlb19pbnB1dHMJPSA0LAoJLmF1ZGlvX2lucHV0cwk9IDEsCgkudHVuZXIJCT0gMCwKCS5zdmhzCQk9IDIsCiAgICAgICAgLmdwaW9tYXNrICAgICAgID0gMHgwMzAwMEYsCgkubXV4c2VsCQk9IHsgMiwgMywgMSwgMH0sCiAgICAgICAgLmF1ZGlvbXV4ICAgICAgID0geyAyLDAsMCwwLDEgfSwKCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCS50dW5lcl90eXBlCT0gMCwKfSx7CgovKiAtLS0tIGNhcmQgMHgzYyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgkvKiBQaGlsaXAgQmx1bmRlbGwgPHBoaWxiQGdudS5vcmc+ICovCgkubmFtZSAgICAgICAgICAgPSAiTW9kdWxhciBUZWNobm9sb2d5IE1NMTAwUENUViIsCgkudmlkZW9faW5wdXRzICAgPSAyLAoJLmF1ZGlvX2lucHV0cyAgID0gMiwKCS50dW5lcgkJPSAwLAoJLnN2aHMJCT0gLTEsCgkuZ3Bpb21hc2sgICAgICAgPSAxMSwKCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMX0sCgkuYXVkaW9tdXggICAgICAgPSB7IDIsIDAsIDAsIDEsIDh9LAoJLnBsbCAgICAgICAgICAgID0gUExMXzM1LAoJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfVEVNSUNfUEFMLAoKfSx7CgkvKiBBZHJpYW4gQ294IDxhZHJpYW5AaHVtYm9sZHQuY28udWsgKi8KCS5uYW1lCSAgICAgICAgPSAiQUcgRWxlY3Ryb25pY3MgR01WMSIsCgkudmlkZW9faW5wdXRzICAgPSAyLAoJLmF1ZGlvX2lucHV0cyAgID0gMCwKCS50dW5lcgkgICAgICAgID0gLTEsCgkuc3ZocwkgICAgICAgID0gMSwKCS5ncGlvbWFzayAgICAgICA9IDB4RiwKCS5tdXhzZWwJICAgICAgICA9IHsgMiwgMn0sCgkuYXVkaW9tdXggICAgICAgPSB7IH0sCgkubm9fbXNwMzR4eCAgICAgPSAxLAoJLm5lZWRzX3R2YXVkaW8gID0gMCwKCS5wbGwJICAgICAgICA9IFBMTF8yOCwKCS50dW5lcl90eXBlICAgICA9IC0xLAp9LHsKCS8qIE1pZ3VlbCBBbmdlbCBBbHZhcmV6IDxtYWFjcnV6QG5hdmVnYWxpYS5jb20+CgkgICBuZXcgRWFzeSBUViBCVDg3OCB2ZXJzaW9uIChtb2RlbCBDUEgwNjEpCgkgICBzcGVjaWFsIHRoYW5rcyB0byBJbmZvcm1hdGljYSBNaWVyZXMgZm9yIHByb3ZpZGluZyB0aGUgY2FyZCAqLwoJLm5hbWUgICAgICAgICAgID0gIkFza2V5IENQSDA2MS8gQkVTVEJVWSBFYXN5IFRWIChidDg3OCkiLAoJLnZpZGVvX2lucHV0cwk9IDMsCgkuYXVkaW9faW5wdXRzICAgPSAyLAoJLnR1bmVyICAgICAgICAgID0gMCwKCS5zdmhzICAgICAgICAgICA9IDIsCgkuZ3Bpb21hc2sgICAgICAgPSAweEZGLAoJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAwfSwKCS5hdWRpb211eCAgICAgICA9IHsgMSwgMCwgNCwgNCwgOX0sCgkubmVlZHNfdHZhdWRpbyAgPSAwLAoJLnBsbAkJPSBQTExfMjgsCgkudHVuZXJfdHlwZQk9IFRVTkVSX1BISUxJUFNfUEFMLAp9LHsKCS8qIEx1a2FzIEdlYmF1ZXIgPGdlYnlAdm9sbnkuY3o+ICovCgkubmFtZQkJPSAiQVRJIFRWLVdvbmRlciIsCgkudmlkZW9faW5wdXRzCT0gMywKCS5hdWRpb19pbnB1dHMJPSAxLAoJLnR1bmVyCQk9IDAsCgkuc3ZocwkJPSAyLAoJLmdwaW9tYXNrCT0gMHhmMDNmLAoJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDAgfSwKCS5hdWRpb211eAk9IHsgMHhiZmZlLCAwLCAweGJmZmYsIDAsIDB4YmZmZX0sCgkucGxsCQk9IFBMTF8yOCwKCS50dW5lcl90eXBlCT0gVFVORVJfVEVNSUNfNDAwNkZONV9NVUxUSV9QQUwsCn0sewoKLyogLS0tLSBjYXJkIDB4NDAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJLyogTHVrYXMgR2ViYXVlciA8Z2VieUB2b2xueS5jej4gKi8KCS5uYW1lCQk9ICJBVEkgVFYtV29uZGVyIFZFIiwKCS52aWRlb19pbnB1dHMJPSAyLAoJLmF1ZGlvX2lucHV0cwk9IDEsCgkudHVuZXIJCT0gMCwKCS5zdmhzCQk9IC0xLAoJLmdwaW9tYXNrCT0gMSwKCS5tdXhzZWwJCT0geyAyLCAzLCAwLCAxfSwKCS5hdWRpb211eAk9IHsgMCwgMCwgMSwgMCwgMH0sCgkubm9fbXNwMzR4eAk9IDEsCgkucGxsCQk9IFBMTF8yOCwKCS50dW5lcl90eXBlCT0gVFVORVJfVEVNSUNfNDAwNkZONV9NVUxUSV9QQUwsCn0sewoJLyogRGVlSmF5IDxkZWVqYXlAd2VzdGVsOTAwLm5ldCAoMjAwMFMpICovCgkubmFtZSAgICAgICAgICAgPSAiTGlmZXZpZXcgRmx5VmlkZW8gMjAwMFMgTFI5MCIsCgkudmlkZW9faW5wdXRzICAgPSAzLAoJLmF1ZGlvX2lucHV0cyAgID0gMywKCS50dW5lciAgICAgICAgICA9IDAsCgkuc3ZocyAgICAgICAgICAgPSAyLAoJLmdwaW9tYXNrCT0gMHgxOGUwLAoJLm11eHNlbAkJPSB7IDIsIDMsIDAsIDF9LAoJCQkvKiBSYWRpbyBjaGFuZ2VkIGZyb20gMWU4MCB0byAweDgwMCB0byBtYWtlCgkJCSAgIEZseVZpZGVvMjAwMFMgaW4gLmh1IGhhcHB5IChnbSkqLwoJCQkvKiAtZGstPz8/OiBzZXQgbXV0ZT0weDE4MDAgZm9yIHRkYTk4NzRoIGRhdWdodGVyYm9hcmQgKi8KCS5hdWRpb211eAk9IHsgMHgwMDAwLDB4MDgwMCwweDEwMDAsMHgxMDAwLDB4MTgwMCwgMHgxMDgwIH0sCgkuYXVkaW9faG9vawk9IGZ2MjAwMHNfYXVkaW8sCgkubm9fbXNwMzR4eAk9IDEsCgkubm9fdGRhOTg3NQk9IDEsCgkubmVlZHNfdHZhdWRpbyAgPSAxLAoJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJLnR1bmVyX3R5cGUgICAgID0gNSwKfSx7CgkubmFtZQkJPSAiVGVycmF0ZWMgVFZhbHVlUmFkaW8iLAoJLnZpZGVvX2lucHV0cwk9IDMsCgkuYXVkaW9faW5wdXRzCT0gMSwKCS50dW5lcgkJPSAwLAoJLnN2aHMJCT0gMiwKCS5ncGlvbWFzawk9IDB4ZmZmZjAwLAoJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAoJLmF1ZGlvbXV4CT0geyAweDUwMCwgMHg1MDAsIDB4MzAwLCAweDkwMCwgMHg5MDB9LAoJLm5lZWRzX3R2YXVkaW8JPSAxLAoJLnBsbAkJPSBQTExfMjgsCgkudHVuZXJfdHlwZQk9IFRVTkVSX1BISUxJUFNfUEFMLAoJLmhhc19yYWRpbwk9IDEsCn0sewoJLyogVEFOQUtBIEtlaSA8cGVnMDA2MjVAbmlmdHkuY29tPiAqLwoJLm5hbWUgICAgICAgICAgID0gIklPREFUQSBHVi1CQ1RWNC9QQ0kiLAoJLnZpZGVvX2lucHV0cyAgID0gMywKCS5hdWRpb19pbnB1dHMgICA9IDEsCgkudHVuZXIgICAgICAgICAgPSAwLAoJLnN2aHMgICAgICAgICAgID0gMiwKCS5ncGlvbWFzayAgICAgICA9IDB4MDEwZjAwLAoJLm11eHNlbCAgICAgICAgID0gezIsIDMsIDAsIDB9LAoJLmF1ZGlvbXV4ICAgICAgID0gezB4MTAwMDAsIDAsIDB4MTAwMDAsIDAsIDAsIDB9LAoJLm5vX21zcDM0eHggICAgID0gMSwKCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1NIQVJQXzJVNUpGNTU0MF9OVFNDLAoJLmF1ZGlvX2hvb2sgICAgID0gZ3ZiY3R2M3BjaV9hdWRpbywKfSx7CgovKiAtLS0tIGNhcmQgMHg0NCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAgICAgICAgLm5hbWUgICAgICAgICAgID0gIjNEZnggVm9vZG9vVFYgRk0gKEV1cm8pLCBWb29kb29UViAyMDAgKFVTQSkiLAoJLy8gdHJ5ICJpbnNtb2QgbXNwMzQwMCBzaW1wbGU9MCIgaWYgeW91IGhhdmUKCS8vIHNvdW5kIHByb2JsZW1zIHdpdGggdGhpcyBjYXJkLgogICAgICAgIC52aWRlb19pbnB1dHMgICA9IDQsCiAgICAgICAgLmF1ZGlvX2lucHV0cyAgID0gMSwKICAgICAgICAudHVuZXIgICAgICAgICAgPSAwLAogICAgICAgIC5zdmhzICAgICAgICAgICA9IC0xLAogICAgICAgIC5ncGlvbWFzayAgICAgICA9IDB4NGY4YTAwLAoJLy8gMHgxMDAwMDA6IDE9TVNQIGVuYWJsZWQgKDA9ZGlzYWJsZSBhZ2FpbikKCS8vIDB4MDEwMDAwOiBDb25uZWN0ZWQgdG8gIlMwIiBvbiB0ZGE5ODgwICgwPVBhbC9CRywgMT1OVFNDKQogICAgICAgIC5hdWRpb211eCAgICAgICA9IHsweDk0N2ZmZiwgMHg5ODdmZmYsMHg5NDdmZmYsMHg5NDdmZmYsIDB4OTQ3ZmZmfSwKCS8vIHR2dHVuZXIsIHJhZGlvLCAgIGV4dGVybmFsLGludGVybmFsLCBtdXRlLCAgc3RlcmVvCgkvKiB0dW5lciwgQ29tcG9zaXQsIFNWaWQsIENvbXBvc2l0LW9uLVN2aWQtYWRhcHRlciovCiAgICAgICAgLm11eHNlbCAgICAgICAgID0geyAyLCAzICwwICwxfSwKICAgICAgICAudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9NVDIwMzIsCgkucGxsCQk9IFBMTF8yOCwKCS5oYXNfcmFkaW8JPSAxLAp9LHsKCS8qIFBoaWxpcCBCbHVuZGVsbCA8cGJAbmV4dXMuY28udWs+ICovCgkubmFtZSAgICAgICAgICAgPSAiQWN0aXZlIEltYWdpbmcgQUlNTVMiLAoJLnZpZGVvX2lucHV0cyAgID0gMSwKCS5hdWRpb19pbnB1dHMgICA9IDAsCgkudHVuZXIgICAgICAgICAgPSAtMSwKCS50dW5lcl90eXBlICAgICA9IC0xLAoJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJLm11eHNlbCAgICAgICAgID0geyAyIH0sCgkuZ3Bpb21hc2sgICAgICAgPSAwCn0sewogICAgICAgIC8qIFRvbWFzeiBQeXJhIDxoZWxsZmlyZUBzZWRlei5pcS5wbD4gKi8KICAgICAgICAubmFtZSAgICAgICAgICAgPSAiUHJvbGluayBQaXhlbHZpZXcgUFYtQlQ4NzhQKyAoUmV2LjRDLDhFKSIsCiAgICAgICAgLnZpZGVvX2lucHV0cyAgID0gMywKICAgICAgICAuYXVkaW9faW5wdXRzICAgPSA0LAogICAgICAgIC50dW5lciAgICAgICAgICA9IDAsCiAgICAgICAgLnN2aHMgICAgICAgICAgID0gMiwKICAgICAgICAuZ3Bpb21hc2sgICAgICAgPSAxNSwKICAgICAgICAubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDF9LAogICAgICAgIC5hdWRpb211eCAgICAgICA9IHsgMCwgMCwgMTEsIDcsIDEzLCAwfSwgLy8gVFYgYW5kIFJhZGlvIHdpdGggc2FtZSBHUElPICEKICAgICAgICAubmVlZHNfdHZhdWRpbyAgPSAxLAogICAgICAgIC5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKICAgICAgICAudHVuZXJfdHlwZSAgICAgPSAyNSwKCS5oYXNfcmVtb3RlICAgICA9IDEsCgkvKiBHUElPIHdpcmluZzoKCQlHUElPMDogVTQuQTAgKGhlZjQwNTJidCkKCQlHUElPMTogVTQuQTEKCQlHUElPMjogVTQuQTEgKHNlY29uZCBoZWY0MDUyYnQpCgkJR1BJTzM6IFU0Lm5FTiwgVTUuQTAsIEE1Lm5FTgoJCUdQSU84LTE1OiB2cmQ4NjZiID8KCSAqLwp9LHsKCS5uYW1lCQk9ICJMaWZldmlldyBGbHlWaWRlbyA5OEVaIChjYXB0dXJlIG9ubHkpIExSNTEiLAoJLnZpZGVvX2lucHV0cwk9IDQsCgkuYXVkaW9faW5wdXRzICAgPSAwLAoJLnR1bmVyCQk9IC0xLAoJLnN2aHMJCT0gMiwKCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwgLy8gQVYxLCBBVjIsIFNWSFMsIENWaWQgYWRhcHRlciBvbiBTVkhTCgkucGxsCQk9IFBMTF8yOCwKCS5ub19tc3AzNHh4CT0gMSwKfSx7CgovKiAtLS0tIGNhcmQgMHg0OCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgkvKiBEYXJpdXN6IEtvd2FsZXdza2kgPGRhcmVra0BhdXRvbWV4LnBsPiAqLwoJLm5hbWUJCT0gIlByb2xpbmsgUGl4ZWx2aWV3IFBWLUJUODc4UCs5QiAoUGxheVRWIFBybyByZXYuOUIgRk0rTklDQU0pIiwKCS52aWRlb19pbnB1dHMJPSA0LAoJLmF1ZGlvX2lucHV0cwk9IDEsCgkudHVuZXIJCT0gMCwKCS5zdmhzCQk9IDIsCgkuZ3Bpb21hc2sJPSAweDNmLAoJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDEgfSwKCS5hdWRpb211eAk9IHsgMHgwMSwgMHgwMCwgMHgwMywgMHgwMywgMHgwOSwgMHgwMiB9LAoJLm5lZWRzX3R2YXVkaW8gID0gMSwKCS5ub19tc3AzNHh4CT0gMSwKCS5ub190ZGE5ODc1CT0gMSwKCS5wbGwJCT0gUExMXzI4LAoJLnR1bmVyX3R5cGUJPSA1LAoJLmF1ZGlvX2hvb2sJPSBwdmJ0ODc4cDliX2F1ZGlvLCAvLyBOb3RlOiBub3QgYWxsIGNhcmRzIGhhdmUgc3RlcmVvCgkuaGFzX3JhZGlvCT0gMSwgIC8vIE5vdGU6IG5vdCBhbGwgY2FyZHMgaGF2ZSByYWRpbwoJLmhhc19yZW1vdGUgICAgID0gMSwKCS8qIEdQSU8gd2lyaW5nOgoJCUdQSU8wOiBBMCBoZWY0MDUyCgkJR1BJTzE6IEExIGhlZjQwNTIKCQlHUElPMzogbkVOIGhlZjQwNTIKCQlHUElPOC0xNTogdnJkODY2YgoJCUdQSU8yMCwyMiwyMzogUjMwLFIyOSxSMjgKCSAqLwp9LHsKCS8qIENsYXkgS3VueiA8Y2t1bnpAbWFpbC5hcmMubmFzYS5nb3Y+ICovCgkvKiB5b3UgbXVzdCBqdW1wZXIgSlA1IGZvciB0aGUgY2FyZCB0byB3b3JrICovCgkubmFtZSAgICAgICAgICAgPSAiU2Vuc29yYXkgMzExIiwKCS52aWRlb19pbnB1dHMgICA9IDUsCgkuYXVkaW9faW5wdXRzICAgPSAwLAoJLnR1bmVyICAgICAgICAgID0gLTEsCgkuc3ZocyAgICAgICAgICAgPSA0LAoJLmdwaW9tYXNrICAgICAgID0gMCwKCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMCwgMH0sCgkuYXVkaW9tdXggICAgICAgPSB7IDAgfSwKCS5uZWVkc190dmF1ZGlvICA9IDAsCgkudHVuZXJfdHlwZSAgICAgPSAtMSwKfSx7CgkvKiBNaWd1ZWwgRnJlaXRhcyA8bWlndWVsQGNldHVjLnB1Yy1yaW8uYnI+ICovCgkubmFtZSAgICAgICAgICAgPSAiUmVtb3RlVmlzaW9uIE1YIChSVjYwNSkiLAoJLnZpZGVvX2lucHV0cyAgID0gMTYsCgkuYXVkaW9faW5wdXRzICAgPSAwLAoJLnR1bmVyICAgICAgICAgID0gLTEsCgkuc3ZocyAgICAgICAgICAgPSAtMSwKCS5ncGlvbWFzayAgICAgICA9IDB4MDAsCgkuZ3Bpb21hc2syICAgICAgPSAweDA3ZmYsCgkubXV4c2VsICAgICAgICAgPSB7IDB4MzMsIDB4MTMsIDB4MjMsIDB4NDMsIDB4ZjMsIDB4NzMsIDB4ZTMsIDB4MDMsCgkJCSAgMHhkMywgMHhiMywgMHhjMywgMHg2MywgMHg5MywgMHg1MywgMHg4MywgMHhhMyB9LAoJLm5vX21zcDM0eHggICAgID0gMSwKCS5ub190ZGE5ODc1ICAgICA9IDEsCgkudHVuZXJfdHlwZSAgICAgPSAtMSwKCS5tdXhzZWxfaG9vayAgICA9IHJ2NjA1X211eHNlbCwKfSx7CiAgICAgICAgLm5hbWUgICAgICAgICAgID0gIlBvd2VyY29sb3IgTVRWODc4LyBNVFY4NzhSLyBNVFY4NzhGIiwKICAgICAgICAudmlkZW9faW5wdXRzICAgPSAzLAogICAgICAgIC5hdWRpb19pbnB1dHMgICA9IDIsCgkudHVuZXIJCT0gMCwKICAgICAgICAuc3ZocyAgICAgICAgICAgPSAyLAogICAgICAgIC5ncGlvbWFzayAgICAgICA9IDB4MUM4MDBGLCAgLy8gQml0MC0yOiBBdWRpbyBzZWxlY3QsIDgtMTI6cmVtb3RlIGNvbnRyb2wgMTQ6cmVtb3RlIHZhbGlkIDE1OnJlbW90ZSByZXNldAogICAgICAgIC5tdXhzZWwgICAgICAgICA9IHsgMiwgMSwgMSwgfSwKICAgICAgICAuYXVkaW9tdXggICAgICAgPSB7IDAsIDEsIDIsIDIsIDQgfSwKICAgICAgICAubmVlZHNfdHZhdWRpbyAgPSAwLAogICAgICAgIC50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfUEFMLAoJLnBsbAkJPSBQTExfMjgsCgkuaGFzX3JhZGlvCT0gMSwKfSx7CgovKiAtLS0tIGNhcmQgMHg0YyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAgICAgICAgLyogTWFzYWtpIFN1enVraSA8bWFzYWtpQGJ0cmVlLm9yZz4gKi8KICAgICAgICAubmFtZSAgICAgICAgICAgPSAiQ2Fub3B1cyBXaW5EVlIgUENJIChDT01QQVEgUHJlc2FyaW8gMzUyNEpQLCA1MTEySlApIiwKICAgICAgICAudmlkZW9faW5wdXRzICAgPSAzLAogICAgICAgIC5hdWRpb19pbnB1dHMgICA9IDEsCiAgICAgICAgLnR1bmVyICAgICAgICAgID0gMCwKICAgICAgICAuc3ZocyAgICAgICAgICAgPSAyLAogICAgICAgIC5ncGlvbWFzayAgICAgICA9IDB4MTQwMDA3LAogICAgICAgIC5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMSB9LAogICAgICAgIC5hdWRpb211eCAgICAgICA9IHsgMCwgMSwgMiwgMywgNCwgMCB9LAogICAgICAgIC50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfTlRTQywKICAgICAgICAuYXVkaW9faG9vayAgICAgPSB3aW5kdnJfYXVkaW8sCn0sewogICAgICAgIC5uYW1lICAgICAgICAgICA9ICJHcmFuZFRlYyBNdWx0aSBDYXB0dXJlIENhcmQgKEJ0ODc4KSIsCiAgICAgICAgLnZpZGVvX2lucHV0cyAgID0gNCwKICAgICAgICAuYXVkaW9faW5wdXRzICAgPSAwLAogICAgICAgIC50dW5lciAgICAgICAgICA9IC0xLAogICAgICAgIC5zdmhzICAgICAgICAgICA9IC0xLAogICAgICAgIC5ncGlvbWFzayAgICAgICA9IDAsCiAgICAgICAgLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAwIH0sCiAgICAgICAgLmF1ZGlvbXV4ICAgICAgID0geyAwIH0sCiAgICAgICAgLm5lZWRzX3R2YXVkaW8gID0gMCwKICAgICAgICAubm9fbXNwMzR4eCAgICAgPSAxLAogICAgICAgIC5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKICAgICAgICAudHVuZXJfdHlwZSAgICAgPSAtMSwKfSx7CiAgICAgICAgLm5hbWUgICAgICAgICAgID0gIkpldHdheSBUVi9DYXB0dXJlIEpXLVRWODc4LUZCSywgS3dvcmxkIEtXLVRWODc4UkYiLAogICAgICAgIC52aWRlb19pbnB1dHMgICA9IDQsCiAgICAgICAgLmF1ZGlvX2lucHV0cyAgID0gMywKICAgICAgICAudHVuZXIgICAgICAgICAgPSAwLAogICAgICAgIC5zdmhzICAgICAgICAgICA9IDIsCiAgICAgICAgLmdwaW9tYXNrICAgICAgID0gNywKICAgICAgICAubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDEgfSwgICAvLyBUdW5lciwgU1ZpZCwgU1ZIUywgU1ZpZCB0byBTVkhTIGNvbm5lY3RvcgogICAgICAgIC5hdWRpb211eCAgICAgICA9IHsgMCAsMCAsNCwgNCw0LDR9LC8vIFllcywgdGhpcyB0dW5lciB1c2VzIHRoZSBzYW1lIGF1ZGlvIG91dHB1dCBmb3IgVFYgYW5kIEZNIHJhZGlvIQoJCQkJCSAgLy8gVGhpcyBjYXJkIGxhY2tzIGV4dGVybmFsIEF1ZGlvIEluLCBzbyB3ZSBtdXRlIGl0IG9uIEV4dC4gJiBJbnQuCgkJCQkJICAvLyBUaGUgUENCIGNhbiB0YWtlIGEgc2J4MTYzNy9zYngxNjczLCB3aXJpbmcgdW5rbm93bi4KCQkJCQkgIC8vIFRoaXMgY2FyZCBsYWNrcyBQQ0kgc3Vic3lzdGVtIElELCBzaWdoLgoJCQkJCSAgLy8gYXVkaW9tdXg9MTogbG93ZXIgdm9sdW1lLCAyKzM6IG11dGUKCQkJCQkgIC8vIGJ0d2luY2FwIHVzZXMgMHg4MDAwMC8weDgwMDAzCiAgICAgICAgLm5lZWRzX3R2YXVkaW8gID0gMCwKICAgICAgICAubm9fbXNwMzR4eCAgICAgPSAxLAogICAgICAgIC5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKICAgICAgICAudHVuZXJfdHlwZSAgICAgPSA1LCAvLyBTYW1zdW5nIFRDUEE5MDk1UEMyN0EgKEJHK0RLKSwgcGhpbGlwcyBjb21wYXRpYmxlLCB3L0ZNLCBzdGVyZW8gYW5kCgkJCSAgIC8vIHJhZGlvIHNpZ25hbCBzdHJlbmd0aCBpbmRpY2F0b3JzIHdvcmsgZmluZS4KCS5oYXNfcmFkaW8JCT0gMSwKCS8qIEdQSU8gSW5mbzoKCQlHUElPMCwxOiAgIEhFRjQwNTIgQTAsQTEKCQlHUElPMjogICAgIEhFRjQwNTIgbkVOQUJMRQoJCUdQSU8zLTc6ICAgbi5jLgoJCUdQSU84LTEzOiAgSVJEQzM1NyBkYXRhMC01IChkYXRhNiBuLmMuID8pIFtjaGlwIG5vdCBwcmVzZW50IG9uIG15IGNhcmRdCgkJR1BJTzE0LDE1OiA/PwoJCUdQSU8xNi0yMTogbi5jLgoJCUdQSU8yMiwyMzogPz8KCQk/PyAgICAgICA6IG10dThiNTZlcCBtaWNyb2NvbnRyb2xsZXIgZm9yIElSIChHUElPIHdpcmluZyB1bmtub3duKSovCn0sewogICAgICAgIC8qIEFydGh1ciBUZXR6bGFmZi1EZWFzLCBEU1AgRGVzaWduIEx0ZCA8c29mdHdhcmVAZHNwZGVzaWduLmNvbT4gKi8KICAgICAgICAubmFtZSAgICAgICAgICAgPSAiRFNQIERlc2lnbiBUQ1ZJREVPIiwKICAgICAgICAudmlkZW9faW5wdXRzICAgPSA0LAogICAgICAgIC5zdmhzICAgICAgICAgICA9IC0xLAogICAgICAgIC5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMH0sCiAgICAgICAgLnBsbCAgICAgICAgICAgID0gUExMXzI4LAogICAgICAgIC50dW5lcl90eXBlICAgICA9IC0xLAp9LHsKCiAgICAgICAgLyogLS0tLSBjYXJkIDB4NTAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJLm5hbWUgICAgICAgICAgID0gIkhhdXBwYXVnZSBXaW5UViBQVlIiLAogICAgICAgIC52aWRlb19pbnB1dHMgICA9IDQsCiAgICAgICAgLmF1ZGlvX2lucHV0cyAgID0gMSwKICAgICAgICAudHVuZXIgICAgICAgICAgPSAwLAogICAgICAgIC5zdmhzICAgICAgICAgICA9IDIsCiAgICAgICAgLm11eHNlbCAgICAgICAgID0geyAyLCAwLCAxLCAxfSwKICAgICAgICAubmVlZHNfdHZhdWRpbyAgPSAxLAogICAgICAgIC5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKICAgICAgICAudHVuZXJfdHlwZSAgICAgPSAtMSwKCgkuZ3Bpb21hc2sgICAgICAgPSA3LAoJLmF1ZGlvbXV4ICAgICAgID0gezd9LAp9LHsKCS5uYW1lICAgICAgICAgICA9ICJJT0RBVEEgR1YtQkNUVjUvUENJIiwKCS52aWRlb19pbnB1dHMgICA9IDMsCgkuYXVkaW9faW5wdXRzICAgPSAxLAoJLnR1bmVyICAgICAgICAgID0gMCwKCS5zdmhzICAgICAgICAgICA9IDIsCgkuZ3Bpb21hc2sgICAgICAgPSAweDBmMGY4MCwKCS5tdXhzZWwgICAgICAgICA9IHsyLCAzLCAxLCAwfSwKCS5hdWRpb211eCAgICAgICA9IHsweDAzMDAwMCwgMHgwMTAwMDAsIDAsIDAsIDB4MDIwMDAwLCAwfSwKCS5ub19tc3AzNHh4ICAgICA9IDEsCgkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX05UU0NfTSwKCS5hdWRpb19ob29rICAgICA9IGd2YmN0djVwY2lfYXVkaW8sCgkuaGFzX3JhZGlvICAgICAgPSAxLAp9LHsKCS5uYW1lICAgICAgICAgICA9ICJPc3ByZXkgMTAwLzE1MCAoODc4KSIsIC8qIDB4MSgyfDMpLTQ1QzYtQzEgKi8KCS52aWRlb19pbnB1dHMgICA9IDQsICAgICAgICAgICAgICAgICAgLyogaWQtaW5wdXRzLWNsb2NrICovCgkuYXVkaW9faW5wdXRzICAgPSAwLAoJLnR1bmVyICAgICAgICAgID0gLTEsCgkuc3ZocyAgICAgICAgICAgPSAzLAoJLm11eHNlbCAgICAgICAgID0geyAzLCAyLCAwLCAxIH0sCgkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkudHVuZXJfdHlwZSAgICAgPSAtMSwKICAgICAgICAubm9fbXNwMzR4eCAgICAgPSAxLAogICAgICAgIC5ub190ZGE5ODc1ICAgICA9IDEsCiAgICAgICAgLm5vX3RkYTc0MzIgICAgID0gMSwKfSx7CgkubmFtZSAgICAgICAgICAgPSAiT3NwcmV5IDEwMC8xNTAgKDg0OCkiLCAvKiAweDA0LTU0QzAtQzEgJiBvbGRlciBib2FyZHMgKi8KCS52aWRlb19pbnB1dHMgICA9IDMsCgkuYXVkaW9faW5wdXRzICAgPSAwLAoJLnR1bmVyICAgICAgICAgID0gLTEsCgkuc3ZocyAgICAgICAgICAgPSAyLAoJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxIH0sCgkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkudHVuZXJfdHlwZSAgICAgPSAtMSwKICAgICAgICAubm9fbXNwMzR4eCAgICAgPSAxLAogICAgICAgIC5ub190ZGE5ODc1ICAgICA9IDEsCiAgICAgICAgLm5vX3RkYTc0MzIgICAgID0gMSwKfSx7CgoJLyogLS0tLSBjYXJkIDB4NTQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJLm5hbWUgICAgICAgICAgID0gIk9zcHJleSAxMDEgKDg0OCkiLCAvKiAweDA1LTQwQzAtQzEgKi8KCS52aWRlb19pbnB1dHMgICA9IDIsCgkuYXVkaW9faW5wdXRzICAgPSAwLAoJLnR1bmVyICAgICAgICAgID0gLTEsCgkuc3ZocyAgICAgICAgICAgPSAxLAoJLm11eHNlbCAgICAgICAgID0geyAzLCAxIH0sCgkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkudHVuZXJfdHlwZSAgICAgPSAtMSwKICAgICAgICAubm9fbXNwMzR4eCAgICAgPSAxLAogICAgICAgIC5ub190ZGE5ODc1ICAgICA9IDEsCiAgICAgICAgLm5vX3RkYTc0MzIgICAgID0gMSwKfSx7CgkubmFtZSAgICAgICAgICAgPSAiT3NwcmV5IDEwMS8xNTEiLCAgICAgICAvKiAweDEoNHw1KS0wMDA0LUM0ICovCgkudmlkZW9faW5wdXRzICAgPSAxLAoJLmF1ZGlvX2lucHV0cyAgID0gMCwKCS50dW5lciAgICAgICAgICA9IC0xLAoJLnN2aHMgICAgICAgICAgID0gLTEsCgkubXV4c2VsICAgICAgICAgPSB7IDAgfSwKCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCS50dW5lcl90eXBlICAgICA9IC0xLAogICAgICAgIC5ub19tc3AzNHh4ICAgICA9IDEsCiAgICAgICAgLm5vX3RkYTk4NzUgICAgID0gMSwKICAgICAgICAubm9fdGRhNzQzMiAgICAgPSAxLAp9LHsKCS5uYW1lICAgICAgICAgICA9ICJPc3ByZXkgMTAxLzE1MSB3LyBzdmlkIiwgIC8qIDB4KDE2fDE3fDIwKS0wMEM0LUMxICovCgkudmlkZW9faW5wdXRzICAgPSAyLAoJLmF1ZGlvX2lucHV0cyAgID0gMCwKCS50dW5lciAgICAgICAgICA9IC0xLAoJLnN2aHMgICAgICAgICAgID0gMSwKCS5tdXhzZWwgICAgICAgICA9IHsgMCwgMSB9LAoJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJLnR1bmVyX3R5cGUgICAgID0gLTEsCiAgICAgICAgLm5vX21zcDM0eHggICAgID0gMSwKICAgICAgICAubm9fdGRhOTg3NSAgICAgPSAxLAogICAgICAgIC5ub190ZGE3NDMyICAgICA9IDEsCn0sewoJLm5hbWUgICAgICAgICAgID0gIk9zcHJleSAyMDAvMjAxLzI1MC8yNTEiLCAgLyogMHgxKDh8OXxFfEYpLTAwMDQtQzQgKi8KCS52aWRlb19pbnB1dHMgICA9IDEsCgkuYXVkaW9faW5wdXRzICAgPSAxLAoJLnR1bmVyICAgICAgICAgID0gLTEsCgkuc3ZocyAgICAgICAgICAgPSAtMSwKCS5tdXhzZWwgICAgICAgICA9IHsgMCB9LAoJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJLnR1bmVyX3R5cGUgICAgID0gLTEsCiAgICAgICAgLm5vX21zcDM0eHggICAgID0gMSwKICAgICAgICAubm9fdGRhOTg3NSAgICAgPSAxLAogICAgICAgIC5ub190ZGE3NDMyICAgICA9IDEsCn0sewoKCS8qIC0tLS0gY2FyZCAweDU4IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCS5uYW1lICAgICAgICAgICA9ICJPc3ByZXkgMjAwLzI1MCIsICAgLyogMHgxKEF8QiktMDBDNC1DMSAqLwoJLnZpZGVvX2lucHV0cyAgID0gMiwKCS5hdWRpb19pbnB1dHMgICA9IDEsCgkudHVuZXIgICAgICAgICAgPSAtMSwKCS5zdmhzICAgICAgICAgICA9IDEsCgkubXV4c2VsICAgICAgICAgPSB7IDAsIDEgfSwKCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCS50dW5lcl90eXBlICAgICA9IC0xLAogICAgICAgIC5ub19tc3AzNHh4ICAgICA9IDEsCiAgICAgICAgLm5vX3RkYTk4NzUgICAgID0gMSwKICAgICAgICAubm9fdGRhNzQzMiAgICAgPSAxLAp9LHsKCS5uYW1lICAgICAgICAgICA9ICJPc3ByZXkgMjEwLzIyMCIsICAgLyogMHgxKEF8QiktMDRDMC1DMSAqLwoJLnZpZGVvX2lucHV0cyAgID0gMiwKCS5hdWRpb19pbnB1dHMgICA9IDEsCgkudHVuZXIgICAgICAgICAgPSAtMSwKCS5zdmhzICAgICAgICAgICA9IDEsCgkubXV4c2VsICAgICAgICAgPSB7IDIsIDMgfSwKCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCS50dW5lcl90eXBlICAgICA9IC0xLAogICAgICAgIC5ub19tc3AzNHh4ICAgICA9IDEsCiAgICAgICAgLm5vX3RkYTk4NzUgICAgID0gMSwKICAgICAgICAubm9fdGRhNzQzMiAgICAgPSAxLAp9LHsKCS5uYW1lICAgICAgICAgICA9ICJPc3ByZXkgNTAwIiwgICAvKiA1MDAgKi8KCS52aWRlb19pbnB1dHMgICA9IDIsCgkuYXVkaW9faW5wdXRzICAgPSAxLAoJLnR1bmVyICAgICAgICAgID0gLTEsCgkuc3ZocyAgICAgICAgICAgPSAxLAoJLm11eHNlbCAgICAgICAgID0geyAyLCAzIH0sCgkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkudHVuZXJfdHlwZSAgICAgPSAtMSwKICAgICAgICAubm9fbXNwMzR4eCAgICAgPSAxLAogICAgICAgIC5ub190ZGE5ODc1ICAgICA9IDEsCiAgICAgICAgLm5vX3RkYTc0MzIgICAgID0gMSwKfSx7CiAgICAgICAubmFtZSAgICAgICAgICAgPSAiT3NwcmV5IDU0MCIsICAgLyogNTQwICovCiAgICAgICAudmlkZW9faW5wdXRzICAgPSA0LAogICAgICAgLmF1ZGlvX2lucHV0cyAgID0gMSwKICAgICAgIC50dW5lciAgICAgICAgICA9IC0xLAojaWYgMCAvKiBUT0RPIC4uLiAqLwogICAgICAgLnN2aHMgICAgICAgICAgID0gT1NQUkVZNTQwX1NWSURfQU5BTE9HLAogICAgICAgLm11eHNlbCAgICAgICAgID0geyAgICAgICBbT1NQUkVZNTQwX0NPTVBfQU5BTE9HXSA9IDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbT1NQUkVZNTQwX1NWSURfQU5BTE9HXSA9IDMsIH0sCiNlbmRpZgogICAgICAgLnBsbCAgICAgICAgICAgID0gUExMXzI4LAogICAgICAgLnR1bmVyX3R5cGUgICAgID0gLTEsCiAgICAgICAubm9fbXNwMzR4eCAgICAgPSAxLAogICAgICAgLm5vX3RkYTk4NzUgICAgID0gMSwKICAgICAgIC5ub190ZGE3NDMyICAgICA9IDEsCiNpZiAwIC8qIFRPRE8gLi4uICovCiAgICAgICAubXV4c2VsX2hvb2sgICAgPSBvc3ByZXlfNTQwX211eHNlbCwKICAgICAgIC5waWN0dXJlX2hvb2sgICA9IG9zcHJleV81NDBfc2V0X3BpY3R1cmUsCiNlbmRpZgp9LHsKCgkvKiAtLS0tIGNhcmQgMHg1QyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgkubmFtZSAgICAgICAgICAgPSAiT3NwcmV5IDIwMDAiLCAgLyogMjAwMCAqLwoJLnZpZGVvX2lucHV0cyAgID0gMiwKCS5hdWRpb19pbnB1dHMgICA9IDEsCgkudHVuZXIgICAgICAgICAgPSAtMSwKCS5zdmhzICAgICAgICAgICA9IDEsCgkubXV4c2VsICAgICAgICAgPSB7IDIsIDMgfSwKCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCS50dW5lcl90eXBlICAgICA9IC0xLAogICAgICAgIC5ub19tc3AzNHh4ICAgICA9IDEsCiAgICAgICAgLm5vX3RkYTk4NzUgICAgID0gMSwKICAgICAgICAubm9fdGRhNzQzMiAgICAgPSAxLCAgICAgIC8qIG11c3QgYXZvaWQsIGNvbmZsaWN0cyB3aXRoIHRoZSBidDg2MCAqLwp9LHsKCS8qIE0gRyBCZXJiZXJpY2ggPGJlcmJlcmljQGZvcndpc3MudW5pLXBhc3NhdS5kZT4gKi8KCS5uYW1lICAgICAgICAgICA9ICJJRFMgRWFnbGUiLAoJLnZpZGVvX2lucHV0cyAgID0gNCwKCS5hdWRpb19pbnB1dHMgICA9IDAsCgkudHVuZXIgICAgICAgICAgPSAtMSwKCS50dW5lcl90eXBlICAgICA9IC0xLAoJLnN2aHMgICAgICAgICAgID0gLTEsCgkuZ3Bpb21hc2sgICAgICAgPSAwLAoJLm11eHNlbCAgICAgICAgID0geyAwLCAxLCAyLCAzIH0sCgkubXV4c2VsX2hvb2sgICAgPSBlYWdsZV9tdXhzZWwsCgkubm9fbXNwMzR4eCAgICAgPSAxLAoJLm5vX3RkYTk4NzUgICAgID0gMSwKCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKfSx7CgkubmFtZSAgICAgICAgICAgPSAiUGlubmFjbGUgUENUViBTYXQiLAoJLnZpZGVvX2lucHV0cyAgID0gMiwKCS5hdWRpb19pbnB1dHMgICA9IDAsCgkuc3ZocyAgICAgICAgICAgPSAxLAoJLnR1bmVyICAgICAgICAgID0gLTEsCgkudHVuZXJfdHlwZSAgICAgPSAtMSwKCS5ub19tc3AzNHh4ICAgICA9IDEsCgkubm9fdGRhOTg3NSAgICAgPSAxLAoJLm5vX3RkYTc0MzIgICAgID0gMSwKCS5ncGlvbWFzayAgICAgICA9IDB4MDEsCgkuYXVkaW9tdXggICAgICAgPSB7IDAsIDAsIDAsIDAsIDEgfSwKCS5tdXhzZWwgICAgICAgICA9IHsgMywgMCwgMSwgMn0sCgkubmVlZHNfdHZhdWRpbyAgPSAwLAoJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJLm5vX2dwaW9pcnEgICAgID0gMSwKCS5oYXNfZHZiICAgICAgICA9IDEsCn0sewogICAgICAgIC5uYW1lICAgICAgICAgICA9ICJGb3JtYWMgUHJvVFYgSUkgKGJ0ODc4KSIsCiAgICAgICAgLnZpZGVvX2lucHV0cyAgID0gNCwKICAgICAgICAuYXVkaW9faW5wdXRzICAgPSAxLAogICAgICAgIC50dW5lciAgICAgICAgICA9IDAsCiAgICAgICAgLnN2aHMgICAgICAgICAgID0gMywKICAgICAgICAuZ3Bpb21hc2sgICAgICAgPSAyLAoJLy8gVFYsIENvbXAxLCBDb21wb3NpdGUgb3ZlciBTVklEIGNvbiwgU1ZJRAogICAgICAgIC5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMX0sCiAgICAgICAgLmF1ZGlvbXV4ICAgICAgID0geyAyLCAyLCAwLCAwLCAwIH0sCiAgICAgICAgLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJLmhhc19yYWRpbyAgICAgID0gMSwKICAgICAgICAudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX1BBTCwKICAgICAgLyogc291bmQgcm91dGluZzoKICAgICAgICAgICBHUElPPTB4MDAsMHgwMSwweDAzOiBtdXRlICg/KQogICAgICAgICAgICAgIDB4MDI6IGJvdGggVFYgYW5kIHJhZGlvICh0dW5lcjogRk0xMjE2L0kpCiAgICAgICAgIFRoZSBjYXJkIGhhcyBvbmJvYXJkIGF1ZGlvIGNvbm5lY3RvcnMgbGFiZWxlZCAiY2Ryb20iIGFuZCAiYm9hcmQiLAoJIG5vdCBzb2xkZXJlZCBoZXJlLCB0aG91Z2ggdW5rbm93biB3aXJpbmcuCiAgICAgICAgIENhcmQgbGFja3M6IGV4dGVybmFsIGF1ZGlvIGluLCBwY2kgc3Vic3lzdGVtIGlkLgogICAgICAgKi8KfSx7CgoJLyogLS0tLSBjYXJkIDB4NjAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJLm5hbWUgICAgICAgICAgID0gIk1hY2hUViIsCiAgICAgICAgLnZpZGVvX2lucHV0cyAgID0gMywKICAgICAgICAuYXVkaW9faW5wdXRzICAgPSAxLAogICAgICAgIC50dW5lciAgICAgICAgICA9IDAsCiAgICAgICAgLnN2aHMgICAgICAgICAgID0gLTEsCiAgICAgICAgLmdwaW9tYXNrICAgICAgID0gNywKICAgICAgICAubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDF9LAogICAgICAgIC5hdWRpb211eCAgICAgICA9IHsgMCwgMSwgMiwgMywgNH0sCiAgICAgICAgLm5lZWRzX3R2YXVkaW8gID0gMSwKICAgICAgICAudHVuZXJfdHlwZSAgICAgPSA1LAoJLnBsbCAgICAgICAgICAgID0gMSwKfSx7CgkubmFtZSAgICAgICAgICAgPSAiRXVyZXN5cyBQaWNvbG8iLAoJLnZpZGVvX2lucHV0cyAgID0gMywKCS5hdWRpb19pbnB1dHMgICA9IDAsCgkudHVuZXIgICAgICAgICAgPSAtMSwKCS5zdmhzICAgICAgICAgICA9IDIsCgkuZ3Bpb21hc2sgICAgICAgPSAwLAoJLm5vX21zcDM0eHggICAgID0gMSwKCS5ub190ZGE5ODc1ICAgICA9IDEsCgkubm9fdGRhNzQzMiAgICAgPSAxLAoJLm11eHNlbCAgICAgICAgID0geyAyLCAwLCAxfSwKCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKfSx7CgkvKiBMdWMgVmFuIEhvZXlsYW5kdCA8bHVjQGUtbWFnaWMuYmU+ICovCgkubmFtZSAgICAgICAgICAgPSAiUHJvVmlkZW8gUFYxNTAiLCAvKiAweDRmICovCgkudmlkZW9faW5wdXRzICAgPSAyLAoJLmF1ZGlvX2lucHV0cyAgID0gMCwKCS50dW5lciAgICAgICAgICA9IC0xLAoJLnN2aHMgICAgICAgICAgID0gLTEsCgkuZ3Bpb21hc2sgICAgICAgPSAwLAoJLm11eHNlbCAgICAgICAgID0geyAyLCAzIH0sCgkuYXVkaW9tdXggICAgICAgPSB7IDAgfSwKCS5uZWVkc190dmF1ZGlvICA9IDAsCgkubm9fbXNwMzR4eCAgICAgPSAxLAoJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJLnR1bmVyX3R5cGUgICAgID0gLTEsCn0sewoJLyogSGlyb3NoaSBUYWtla2F3YSA8c2lhbkBiaWcub3IuanA+ICovCgkvKiBUaGlzIGNhcmQgbGFja3Mgc3Vic3lzdGVtIElEICovCgkubmFtZSAgICAgICAgICAgPSAiQUQtVFZLNTAzIiwgLyogMHg2MyAqLwoJLnZpZGVvX2lucHV0cyAgID0gNCwKCS5hdWRpb19pbnB1dHMgICA9IDEsCgkudHVuZXIgICAgICAgICAgPSAwLAoJLnN2aHMgICAgICAgICAgID0gMiwKCS5ncGlvbWFzayAgICAgICA9IDB4MDAxZTgwMDcsCgkubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDAgfSwKCS8qICAgICAgICAgICAgICAgICAgVHVuZXIsIFJhZGlvLCBleHRlcm5hbCwgaW50ZXJuYWwsIG9mZiwgIG9uICovCgkuYXVkaW9tdXggICAgICAgPSB7IDB4MDgsICAweDBmLCAgMHgwYSwgICAgIDB4MDgsICAgICAweDBmLCAweDA4IH0sCgkubmVlZHNfdHZhdWRpbyAgPSAwLAoJLm5vX21zcDM0eHggICAgID0gMSwKCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCS50dW5lcl90eXBlICAgICA9IDIsCgkuYXVkaW9faG9vawk9IGFkdHZrNTAzX2F1ZGlvLAp9LHsKCgkvKiAtLS0tIGNhcmQgMHg2NCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAgICAgICAgLm5hbWUgICAgICAgICAgID0gIkhlcmN1bGVzIFNtYXJ0IFRWIFN0ZXJlbyIsCiAgICAgICAgLnZpZGVvX2lucHV0cyAgID0gNCwKICAgICAgICAuYXVkaW9faW5wdXRzICAgPSAxLAogICAgICAgIC50dW5lciAgICAgICAgICA9IDAsCiAgICAgICAgLnN2aHMgICAgICAgICAgID0gMiwKICAgICAgICAuZ3Bpb21hc2sgICAgICAgPSAweDAwLAogICAgICAgIC5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMSB9LAogICAgICAgIC5uZWVkc190dmF1ZGlvICA9IDEsCiAgICAgICAgLm5vX21zcDM0eHggICAgID0gMSwKICAgICAgICAucGxsICAgICAgICAgICAgPSBQTExfMjgsCiAgICAgICAgLnR1bmVyX3R5cGUgICAgID0gNSwKCS8qIE5vdGVzOgoJICAgLSBjYXJkIGxhY2tzIHN1YnN5c3RlbSBJRAoJICAgLSBzdGVyZW8gdmFyaWFudCB3LyBkYXVnaHRlciBib2FyZCB3aXRoIHRkYTk4NzRhIEAweGIwCgkgICAtIEF1ZGlvIFJvdXRpbmc6CgkJYWx3YXlzIGZyb20gdGRhOTg3NCBpbmRlcGVuZGVudCBvZiBHUElPICg/KQoJCWV4dGVybmFsIGxpbmUgaW46IHVua25vd24KCSAgIC0gT3RoZXIgY2hpcHM6IGVtNzhwMTU2ZWxwIEAgMHg5NiAocHJvYmFibHkgSVIgcmVtb3RlIGNvbnRyb2wpCgkgICAgICAgICAgICAgIGhlZjQwNTMgKGluc3RlYWQgNDA1MikgZm9yIHVua25vd24gZnVuY3Rpb24KCSovCn0sewogICAgICAgIC5uYW1lICAgICAgICAgICA9ICJQYWNlIFRWICYgUmFkaW8gQ2FyZCIsCiAgICAgICAgLnZpZGVvX2lucHV0cyAgID0gNCwKICAgICAgICAuYXVkaW9faW5wdXRzICAgPSAxLAogICAgICAgIC50dW5lciAgICAgICAgICA9IDAsCiAgICAgICAgLnN2aHMgICAgICAgICAgID0gMiwKICAgICAgICAubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDF9LCAvLyBUdW5lciwgQ1ZpZCwgU1ZpZCwgQ1ZpZCBvdmVyIFNWaWQgY29ubmVjdG9yCiAgICAgICAgLmdwaW9tYXNrICAgICAgID0gMCwKICAgICAgICAubm9fdGRhOTg3NSAgICAgPSAxLAogICAgICAgIC5ub190ZGE3NDMyICAgICA9IDEsCiAgICAgICAgLnR1bmVyX3R5cGUgICAgID0gMSwKICAgICAgICAuaGFzX3JhZGlvICAgICAgPSAxLAogICAgICAgIC5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKICAgICAgICAvKiBCdDg3OCwgQnQ4MzIsIEZJMTI0NiB0dW5lcjsgbm8gcGNpIHN1YnN5c3RlbSBpZAogICAgICAgICAgIG9ubHkgaW50ZXJuYWwgbGluZSBvdXQ6ICg0cGluIGhlYWRlcikgUkdHTAogICAgICAgICAgIFJhZGlvIG11c3QgYmUgZGVjb2RlZCBieSBtc3AzNDEwZCAobm90IHJvdXRlZCB0aHJvdWdoKSovCiAgICAgICAgLy8gICAgICAgICAuZGlnaXRhbF9tb2RlICAgPSBESUdJVEFMX01PREVfQ0FNRVJBLCAvLyB0b2RvIQp9LHsKICAgICAgICAvKiBDaHJpcyBXaWxsaW5nIDxjaHJpc0B2aXNsYWIudXN5ZC5lZHUuYXU+ICovCiAgICAgICAgLm5hbWUgICAgICAgICAgID0gIklWQy0yMDAiLAogICAgICAgIC52aWRlb19pbnB1dHMgICA9IDEsCiAgICAgICAgLmF1ZGlvX2lucHV0cyAgID0gMCwKICAgICAgICAudHVuZXIgICAgICAgICAgPSAtMSwKICAgICAgICAudHVuZXJfdHlwZSAgICAgPSAtMSwKICAgICAgICAuc3ZocyAgICAgICAgICAgPSAtMSwKICAgICAgICAuZ3Bpb21hc2sgICAgICAgPSAweGRmLAogICAgICAgIC5tdXhzZWwgICAgICAgICA9IHsgMiB9LAogICAgICAgIC5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKfSx7CgkubmFtZSAgICAgICAgICAgPSAiR3JhbmQgWC1HdWFyZCAvIFRydXN0IDgxNFBDSSIsCgkudmlkZW9faW5wdXRzICAgPSAxNiwKICAgICAgICAuYXVkaW9faW5wdXRzICAgPSAwLAogICAgICAgIC50dW5lciAgICAgICAgICA9IC0xLAogICAgICAgIC5zdmhzICAgICAgICAgICA9IC0xLAoJLnR1bmVyX3R5cGUgICAgID0gNCwKICAgICAgICAuZ3Bpb21hc2syICAgICAgPSAweGZmLAoJLm11eHNlbCAgICAgICAgID0geyAyLDIsMiwyLCAzLDMsMywzLCAxLDEsMSwxLCAwLDAsMCwwIH0sCgkubXV4c2VsX2hvb2sgICAgPSB4Z3VhcmRfbXV4c2VsLAoJLm5vX21zcDM0eHggICAgID0gMSwKCS5ub190ZGE5ODc1ICAgICA9IDEsCiAgICAgICAgLm5vX3RkYTc0MzIgICAgID0gMSwKCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKfSx7CgoJLyogLS0tLSBjYXJkIDB4NjggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJLm5hbWUgICAgICAgICAgID0gIk5lYnVsYSBFbGVjdHJvbmljcyBEaWdpVFYiLAoJLnZpZGVvX2lucHV0cyAgID0gMSwKICAgICAgICAudHVuZXIgICAgICAgICAgPSAtMSwKCS5zdmhzICAgICAgICAgICA9IC0xLAoJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAwfSwKCS5ub19tc3AzNHh4ICAgICA9IDEsCgkubm9fdGRhOTg3NSAgICAgPSAxLAoJLm5vX3RkYTc0MzIgICAgID0gMSwKCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCS50dW5lcl90eXBlICAgICA9IC0xLAoJLmhhc19kdmIgICAgICAgID0gMSwKCS5ub19ncGlvaXJxICAgICA9IDEsCn0sewoJLyogSm9yZ2UgQm9uY29tcHRlIC0gRFRJMiA8am9yZ2VAZHRpMi5uZXQ+ICovCgkubmFtZSAgICAgICAgICAgPSAiUHJvVmlkZW8gUFYxNDMiLAogICAgICAgIC52aWRlb19pbnB1dHMgICA9IDQsCiAgICAgICAgLmF1ZGlvX2lucHV0cyAgID0gMCwKICAgICAgICAudHVuZXIgICAgICAgICAgPSAtMSwKICAgICAgICAuc3ZocyAgICAgICAgICAgPSAtMSwKICAgICAgICAuZ3Bpb21hc2sgICAgICAgPSAwLAogICAgICAgIC5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMCB9LAogICAgICAgIC5hdWRpb211eCAgICAgICA9IHsgMCB9LAogICAgICAgIC5uZWVkc190dmF1ZGlvICA9IDAsCiAgICAgICAgLm5vX21zcDM0eHggICAgID0gMSwKICAgICAgICAucGxsICAgICAgICAgICAgPSBQTExfMjgsCiAgICAgICAgLnR1bmVyX3R5cGUgICAgID0gLTEsCn0sewoJLyogTS5LbGFockBwaHl0ZWMuZGUgKi8KCS5uYW1lICAgICAgICAgICA9ICJQSFlURUMgVkQtMDA5LVgxIE1pbmlESU4gKGJ0ODc4KSIsCgkudmlkZW9faW5wdXRzICAgPSA0LAoJLmF1ZGlvX2lucHV0cyAgID0gMCwKCS50dW5lciAgICAgICAgICA9IC0xLCAvKiBjYXJkIGhhcyBubyB0dW5lciAqLwoJLnN2aHMgICAgICAgICAgID0gMywKCS5ncGlvbWFzayAgICAgICA9IDB4MDAsCgkubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDB9LAoJLmF1ZGlvbXV4ICAgICAgID0geyAwLCAwLCAwLCAwLCAwLCAwIH0sIC8qIGNhcmQgaGFzIG5vIGF1ZGlvICovCgkubmVlZHNfdHZhdWRpbyAgPSAxLAoJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJLnR1bmVyX3R5cGUgICAgID0gLTEsCn0sewoJLm5hbWUgICAgICAgICAgID0gIlBIWVRFQyBWRC0wMDktWDEgQ29tYmkgKGJ0ODc4KSIsCgkudmlkZW9faW5wdXRzICAgPSA0LAoJLmF1ZGlvX2lucHV0cyAgID0gMCwKCS50dW5lciAgICAgICAgICA9IC0xLCAvKiBjYXJkIGhhcyBubyB0dW5lciAqLwoJLnN2aHMgICAgICAgICAgID0gMywKCS5ncGlvbWFzayAgICAgICA9IDB4MDAsCgkubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDF9LAoJLmF1ZGlvbXV4ICAgICAgID0geyAwLCAwLCAwLCAwLCAwLCAwIH0sIC8qIGNhcmQgaGFzIG5vIGF1ZGlvICovCgkubmVlZHNfdHZhdWRpbyAgPSAxLAoJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJLnR1bmVyX3R5cGUgICAgID0gLTEsCn0sewoKCS8qIC0tLS0gY2FyZCAweDZjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCS5uYW1lICAgICAgICAgICA9ICJQSFlURUMgVkQtMDA5IE1pbmlESU4gKGJ0ODc4KSIsCgkudmlkZW9faW5wdXRzICAgPSAxMCwKCS5hdWRpb19pbnB1dHMgICA9IDAsCgkudHVuZXIgICAgICAgICAgPSAtMSwgLyogY2FyZCBoYXMgbm8gdHVuZXIgKi8KCS5zdmhzICAgICAgICAgICA9IDksCgkuZ3Bpb21hc2sgICAgICAgPSAweDAwLAoJLmdwaW9tYXNrMiAgICAgID0gMHgwMywgLyogZ3Bpb21hc2syIGRlZmluZXMgdGhlIGJpdHMgdXNlZCB0byBzd2l0Y2ggYXVkaW8KCQkJCSAgIHZpYSB0aGUgdXBwZXIgbmliYmxlIG9mIG11eHNlbC4gaGVyZTogdXNlZCBmb3IKCQkJCSAgIHh0ZXJuYWwgdmlkZW8tbXV4ICovCgkubXV4c2VsICAgICAgICAgPSB7IDB4MDIsIDB4MTIsIDB4MjIsIDB4MzIsIDB4MDMsIDB4MTMsIDB4MjMsIDB4MzMsIDB4MDEsIDB4MDAgfSwKCS5hdWRpb211eCAgICAgICA9IHsgMCwgMCwgMCwgMCwgMCwgMCB9LCAvKiBjYXJkIGhhcyBubyBhdWRpbyAqLwoJLm5lZWRzX3R2YXVkaW8gID0gMSwKCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCS50dW5lcl90eXBlICAgICA9IC0xLAp9LHsKCS5uYW1lICAgICAgICAgICA9ICJQSFlURUMgVkQtMDA5IENvbWJpIChidDg3OCkiLAoJLnZpZGVvX2lucHV0cyAgID0gMTAsCgkuYXVkaW9faW5wdXRzICAgPSAwLAoJLnR1bmVyICAgICAgICAgID0gLTEsIC8qIGNhcmQgaGFzIG5vIHR1bmVyICovCgkuc3ZocyAgICAgICAgICAgPSA5LAoJLmdwaW9tYXNrICAgICAgID0gMHgwMCwKCS5ncGlvbWFzazIgICAgICA9IDB4MDMsIC8qIGdwaW9tYXNrMiBkZWZpbmVzIHRoZSBiaXRzIHVzZWQgdG8gc3dpdGNoIGF1ZGlvCgkJCQkgICB2aWEgdGhlIHVwcGVyIG5pYmJsZSBvZiBtdXhzZWwuIGhlcmU6IHVzZWQgZm9yCgkJCQkgICB4dGVybmFsIHZpZGVvLW11eCAqLwoJLm11eHNlbCAgICAgICAgID0geyAweDAyLCAweDEyLCAweDIyLCAweDMyLCAweDAzLCAweDEzLCAweDIzLCAweDMzLCAweDAxLCAweDAxIH0sCgkuYXVkaW9tdXggICAgICAgPSB7IDAsIDAsIDAsIDAsIDAsIDAgfSwgLyogY2FyZCBoYXMgbm8gYXVkaW8gKi8KCS5uZWVkc190dmF1ZGlvICA9IDEsCgkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkudHVuZXJfdHlwZSAgICAgPSAtMSwKfSx7CiAgICAgICAgLm5hbWUgICAgICAgICAgID0gIklWQy0xMDAiLAogICAgICAgIC52aWRlb19pbnB1dHMgICA9IDQsCiAgICAgICAgLmF1ZGlvX2lucHV0cyAgID0gMCwKICAgICAgICAudHVuZXIgICAgICAgICAgPSAtMSwKICAgICAgICAudHVuZXJfdHlwZSAgICAgPSAtMSwKICAgICAgICAuc3ZocyAgICAgICAgICAgPSAtMSwKICAgICAgICAuZ3Bpb21hc2sgICAgICAgPSAweGRmLAogICAgICAgIC5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMCB9LAogICAgICAgIC5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKfSx7CgkvKiBJVkMtMTIwRyAtIEFsYW4gR2FyZmllbGQgPGFsYW5AZnJvbW9yYml0LmNvbT4gKi8KCS5uYW1lICAgICAgICAgICA9ICJJVkMtMTIwRyIsCgkudmlkZW9faW5wdXRzICAgPSAxNiwKCS5hdWRpb19pbnB1dHMgICA9IDAsICAgIC8qIGNhcmQgaGFzIG5vIGF1ZGlvICovCgkudHVuZXIgICAgICAgICAgPSAtMSwgICAvKiBjYXJkIGhhcyBubyB0dW5lciAqLwoJLnR1bmVyX3R5cGUgICAgID0gLTEsCgkuc3ZocyAgICAgICAgICAgPSAtMSwgICAvKiBjYXJkIGhhcyBubyBzdmhzICovCgkubmVlZHNfdHZhdWRpbyAgPSAwLAoJLm5vX21zcDM0eHggICAgID0gMSwKCS5ub190ZGE5ODc1ICAgICA9IDEsCgkubm9fdGRhNzQzMiAgICAgPSAxLAoJLmdwaW9tYXNrICAgICAgID0gMHgwMCwKCS5tdXhzZWwgICAgICAgICA9IHsgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgMHgwOCwKCQkJICAgIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIDB4MTAgfSwKCS5tdXhzZWxfaG9vayAgICA9IGl2YzEyMF9tdXhzZWwsCgkucGxsICAgICAgICAgICAgPSBQTExfMjgsCn0sewoKCS8qIC0tLS0gY2FyZCAweDcwIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCS5uYW1lICAgICAgICAgICA9ICJwY0hEVFYgSEQtMjAwMCBUViIsCgkudmlkZW9faW5wdXRzICAgPSA0LAoJLmF1ZGlvX2lucHV0cyAgID0gMSwKCS50dW5lciAgICAgICAgICA9IDAsCgkuc3ZocyAgICAgICAgICAgPSAyLAoJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAwfSwKCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfQVRTQywKCS5oYXNfZHZiICAgICAgICA9IDEsCn0sewoJLm5hbWUgICAgICAgICAgID0gIlR3aW5oYW4gRFNUICsgY2xvbmVzIiwKCS5ub19tc3AzNHh4ICAgICA9IDEsCgkubm9fdGRhOTg3NSAgICAgPSAxLAoJLm5vX3RkYTc0MzIgICAgID0gMSwKCS50dW5lcl90eXBlICAgICA9IFRVTkVSX0FCU0VOVCwKCS5ub192aWRlbyAgICAgICA9IDEsCgkuaGFzX2R2YiAgICAgICAgPSAxLAp9LHsKICAgICAgICAubmFtZSAgICAgICAgICAgPSAiV2luZmFzdCBWQzEwMCIsCgkudmlkZW9faW5wdXRzICAgPSAzLAoJLmF1ZGlvX2lucHV0cyAgID0gMCwKCS5zdmhzICAgICAgICAgICA9IDEsCgkudHVuZXIgICAgICAgICAgPSAtMSwgLy8gbm8gdHVuZXIKCS5tdXhzZWwgICAgICAgICA9IHsgMywgMSwgMSwgM30sIC8vIFZpZCBJbiwgU1ZpZCBJbiwgVmlkIG92ZXIgU1ZpZCBpbiBjb25uZWN0b3IKICAgICAgICAubm9fbXNwMzR4eCAgICAgPSAxLAogICAgICAgIC5ub190ZGE5ODc1ICAgICA9IDEsCiAgICAgICAgLm5vX3RkYTc0MzIgICAgID0gMSwKICAgICAgICAudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9BQlNFTlQsCiAgICAgICAgLm5vX3ZpZGVvICAgICAgID0gMSwKCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKfSx7CgkubmFtZSAgICAgICAgICAgPSAiVGVwcHJvIFRFVi01NjAvSW50ZXJWaXNpb24gSVYtNTYwIiwKCS52aWRlb19pbnB1dHMgICA9IDMsCgkuYXVkaW9faW5wdXRzICAgPSAxLAoJLnR1bmVyICAgICAgICAgID0gMCwKCS5zdmhzICAgICAgICAgICA9IDIsCgkuZ3Bpb21hc2sgICAgICAgPSAzLAoJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAxfSwKCS5hdWRpb211eCAgICAgICA9IHsgMSwgMSwgMSwgMSwgMH0sCgkubmVlZHNfdHZhdWRpbyAgPSAxLAoJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19QQUwsCgkucGxsICAgICAgICAgICAgPSBQTExfMzUsCn0sewoKCS8qIC0tLS0gY2FyZCAweDc0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KICAgICAgICAubmFtZSAgICAgICAgICAgPSAiU0lNVVMgR1ZDMTEwMCIsCiAgICAgICAgLnZpZGVvX2lucHV0cyAgID0gNCwKICAgICAgICAuYXVkaW9faW5wdXRzICAgPSAwLAogICAgICAgIC50dW5lciAgICAgICAgICA9IC0xLAogICAgICAgIC5zdmhzICAgICAgICAgICA9IC0xLAogICAgICAgIC50dW5lcl90eXBlICAgICA9IC0xLAogICAgICAgIC5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKICAgICAgICAubXV4c2VsICAgICAgICAgPSB7IDIsIDIsIDIsIDJ9LAogICAgICAgIC5ncGlvbWFzayAgICAgICA9IDB4M0YsCgkubXV4c2VsX2hvb2sgICAgPSBndmMxMTAwX211eHNlbCwKfSx7CiAgICAgICAgLyogQ2FybG9zIFNpbHZhIHIzcGVrQHIzcGVrLmhvbWVsaW51eC5vcmcgfHwgY2FyZCAweDc1ICovCiAgICAgICAgLm5hbWUgICAgICAgICAgID0gIk5HUyBOR1NUVisiLAogICAgICAgIC52aWRlb19pbnB1dHMgICA9IDMsCiAgICAgICAgLnR1bmVyICAgICAgICAgID0gMCwKICAgICAgICAuc3ZocyAgICAgICAgICAgPSAyLAogICAgICAgIC5ncGlvbWFzayAgICAgICA9IDB4MDA4MDA3LAogICAgICAgIC5tdXhzZWwgICAgICAgICA9IHsyLCAzLCAwLCAwfSwKICAgICAgICAuYXVkaW9tdXggICAgICAgPSB7MCwgMCwgMCwgMCwgMHgwMDAwMDMsIDB9LAogICAgICAgIC5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKICAgICAgICAudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX1BBTCwKICAgICAgICAuaGFzX3JlbW90ZSAgICAgPSAxLAp9LHsKICAgICAgICAvKiBodHRwOi8vbGludXhtZWRpYWxhYnMuY29tICovCiAgICAgICAgLm5hbWUgICAgICAgICAgID0gIkxNTEJUNCIsCiAgICAgICAgLnZpZGVvX2lucHV0cyAgID0gNCwgLyogSU4xLElOMixJTjMsSU40ICovCiAgICAgICAgLmF1ZGlvX2lucHV0cyAgID0gMCwKICAgICAgICAudHVuZXIgICAgICAgICAgPSAtMSwKICAgICAgICAuc3ZocyAgICAgICAgICAgPSAtMSwKICAgICAgICAubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDAgfSwKICAgICAgICAubm9fbXNwMzR4eCAgICAgPSAxLAogICAgICAgIC5ub190ZGE5ODc1ICAgICA9IDEsCiAgICAgICAgLm5vX3RkYTc0MzIgICAgID0gMSwKICAgICAgICAubmVlZHNfdHZhdWRpbyAgPSAwLAp9LHsKCS8qIEhlbG1yb29zIEhhcnJpIDxoYXJyaS5oZWxtcm9vc0BwcC5pbmV0LmZpPiAqLwoJLm5hbWUgICAgICAgICAgID0gIlRla3JhbSBNMjA1IFBSTyIsCgkudmlkZW9faW5wdXRzICAgPSAzLAoJLmF1ZGlvX2lucHV0cyAgID0gMSwKCS50dW5lciAgICAgICAgICA9IDAsCgkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX1BBTCwKCS5zdmhzICAgICAgICAgICA9IDIsCgkubmVlZHNfdHZhdWRpbyAgPSAwLAoJLmdwaW9tYXNrICAgICAgID0gMHg2OCwKCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMX0sCgkuYXVkaW9tdXggICAgICAgPSB7IDB4NjgsIDB4NjgsIDB4NjEsIDB4NjEsIDB4MDAgfSwKCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKfSx7CgoJLyogLS0tLSBjYXJkIDB4NzggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJLyogSmF2aWVyIENlbmRhbiBBcmVzIDxqY2VuZGFuQGx5Y29zLmVzPiAqLwoJLyogYnQ4NzggVFYgKyBGTSB3aXRob3V0IHN1YnN5c3RlbSBJRCAqLwoJLm5hbWUgICAgICAgICAgID0gIkNvbmNlcHRyb25pYyBDT05UVkZNaSIsCgkudmlkZW9faW5wdXRzICAgPSAzLAoJLmF1ZGlvX2lucHV0cyAgID0gMSwKCS50dW5lciAgICAgICAgICA9IDAsCgkuc3ZocyAgICAgICAgICAgPSAyLAoJLmdwaW9tYXNrICAgICAgID0gMHgwMDgwMDcsCgkubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDEgfSwKCS5hdWRpb211eCAgICAgICA9IHsgMCwgMSwgMiwgMiwgMyB9LAoJLm5lZWRzX3R2YXVkaW8gID0gMCwKCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfUEFMLAoJLmhhc19yZW1vdGUgICAgID0gMSwKCS5oYXNfcmFkaW8gICAgICA9IDEsCn0sewoJLypFcmljIERFQklFRiA8ZGViaWVmQHRlbGVtc2EuY29tPiovCgkvKkVVUkVTWVMgUGljb2xvIFRldHJhIDogNCBDb25leGFudCBGdXNpb24gODc4QSwgbm8gYXVkaW8sIHZpZGVvIGlucHV0IHNldCB3aXRoIGFuYWxvZyBtdWx0aXBsZXhlcnMgR1BJTyBjb250cm9sZWQqLwoJLyogYWRkcyBwaWNvbG9fdGV0cmFfbXV4c2VsKCksIHBpY29sb190ZXRyYV9pbml0KCksIHRoZSBmb2xvd2luZyBkZWNsYXJhdGlvbiBzdHJ1Y3VyZSwgYW5kICNkZWZpbmUgQlRUVl9QSUNPTE9fVEVUUkFfQ0hJUCovCgkvKjB4NzkgaW4gYnR0di5oKi8KCS5uYW1lICAgICAgICAgICA9ICJFdXJlc3lzIFBpY29sbyBUZXRyYSIsCgkudmlkZW9faW5wdXRzICAgPSA0LAoJLmF1ZGlvX2lucHV0cyAgID0gMCwKCS50dW5lciAgICAgICAgICA9IC0xLAoJLnN2aHMgICAgICAgICAgID0gLTEsCgkuZ3Bpb21hc2sgICAgICAgPSAwLAoJLmdwaW9tYXNrMiAgICAgID0gMHgzQzw8MTYsLypTZXQgdGhlIEdQSU9bMThdLT5HUElPWzIxXSBhcyBvdXRwdXQgcGluLj09PiBkcml2ZSB0aGUgdmlkZW8gaW5wdXRzIHRocm91Z2ggYW5hbG9nIG11bHRpcGxleGVycyovCgkubm9fbXNwMzR4eCAgICAgPSAxLAoJLm5vX3RkYTk4NzUgICAgID0gMSwKCS5ub190ZGE3NDMyICAgICA9IDEsCgkubXV4c2VsICAgICAgICAgPSB7MiwyLDIsMn0sLyo4NzhBIGlucHV0IGlzIGFsd2F5cyBNVVgwLCBzZWUgYWJvdmUuKi8KCS5hdWRpb211eCAgICAgICA9IHsgMCwgMCwgMCwgMCwgMCwgMCB9LCAvKiBjYXJkIGhhcyBubyBhdWRpbyAqLwoJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJLm5lZWRzX3R2YXVkaW8gID0gMCwKCS5tdXhzZWxfaG9vayAgICA9IHBpY29sb190ZXRyYV9tdXhzZWwsLypSZXF1aXJlZCBhcyBpdCBkb2Vzbid0IGZvbGxvdyB0aGUgY2xhc3NpYyBpbnB1dCBzZWxlY3Rpb24gcG9saWN5Ki8KfSx7CgkvKiBTcGlyaXQgVFYgVHVuZXIgZnJvbSBodHRwOi8vc3Bpcml0bW9kZW1zLmNvbS5hdSAqLwoJLyogU3RhZmZvcmQgR29vZHNlbGwgPHN1cmdlQGdvbGlhdGguaG9tZXVuaXgub3JnPiAqLwoJLm5hbWUgICAgICAgICAgID0gIlNwaXJpdCBUViBUdW5lciIsCgkudmlkZW9faW5wdXRzICAgPSAzLAoJLmF1ZGlvX2lucHV0cyAgID0gMSwKCS50dW5lciAgICAgICAgICA9IDAsCgkuc3ZocyAgICAgICAgICAgPSAyLAoJLmdwaW9tYXNrICAgICAgID0gMHgwMDAwMDAwZiwKCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMSwgMSB9LAoJLmF1ZGlvbXV4ICAgICAgID0geyAweDAyLCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwKCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1RFTUlDX1BBTCwKCS5ub19tc3AzNHh4ICAgICA9IDEsCgkubm9fdGRhOTg3NSAgICAgPSAxLAp9LHsKCS8qIFdvbGZyYW0gSm9vc3QgPHdvam9AZnJva2FzY2h3ZWkuZGU+ICovCiAgICAgICAgLm5hbWUgICAgICAgICAgID0gIkFWZXJNZWRpYSBBVmVyVFYgRFZCLVQgNzcxIiwKICAgICAgICAudmlkZW9faW5wdXRzICAgPSAyLAogICAgICAgIC5zdmhzICAgICAgICAgICA9IDEsCiAgICAgICAgLnR1bmVyICAgICAgICAgID0gLTEsCiAgICAgICAgLnR1bmVyX3R5cGUgICAgID0gVFVORVJfQUJTRU5ULAogICAgICAgIC5tdXhzZWwgICAgICAgICA9IHsgMyAsIDMgfSwKICAgICAgICAubm9fbXNwMzR4eCAgICAgPSAxLAogICAgICAgIC5ub190ZGE5ODc1ICAgICA9IDEsCiAgICAgICAgLm5vX3RkYTc0MzIgICAgID0gMSwKICAgICAgICAucGxsICAgICAgICAgICAgPSBQTExfMjgsCiAgICAgICAgLmhhc19kdmIgICAgICAgID0gMSwKICAgICAgICAubm9fZ3Bpb2lycSAgICAgPSAxLAogICAgICAgIC5oYXNfcmVtb3RlICAgICA9IDEsCn0sewoJLyogLS0tLSBjYXJkIDB4N2MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJLyogTWF0dCBKZXNzb24gPGR2YkBqZXNzb24uZWNsaXBzZS5jby51az4gKi8KCS8qIEJhc2VkIG9uIHRoZSBOZWJ1bGEgY2FyZCBkYXRhIC0gYWRkZWQgcmVtb3RlIGFuZCBuZXcgY2FyZCBudW1iZXIgLSBCVFRWX0FWRFZCVF83NjEsIHNlZSBhbHNvIGlyLWtiZC1ncGlvLmMgKi8KCS5uYW1lICAgICAgICAgICA9ICJBdmVyTWVkaWEgQXZlclRWIERWQi1UIDc2MSIsCgkudmlkZW9faW5wdXRzICAgPSAyLAoJLnR1bmVyICAgICAgICAgID0gLTEsCgkuc3ZocyAgICAgICAgICAgPSAxLAoJLm11eHNlbCAgICAgICAgID0geyAzLCAxLCAyLCAwfSwgLyogQ29tcDAsIFMtVmlkZW8sID8sID8gKi8KCS5ub19tc3AzNHh4ICAgICA9IDEsCgkubm9fdGRhOTg3NSAgICAgPSAxLAoJLm5vX3RkYTc0MzIgICAgID0gMSwKCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCS50dW5lcl90eXBlICAgICA9IC0xLAoJLmhhc19kdmIgICAgICAgID0gMSwKCS5ub19ncGlvaXJxICAgICA9IDEsCgkuaGFzX3JlbW90ZSAgICAgPSAxLAp9LHsKCS8qIGFuZHJlLnNjaHdhcnpAbWF0cml4LXZpc2lvbi5kZSAqLwoJLm5hbWUgICAgICAgICAgICAgPSAiTUFUUklYIFZpc2lvbiBTaWdtYS1TUSIsCgkudmlkZW9faW5wdXRzICAgICA9IDE2LAoJLmF1ZGlvX2lucHV0cyAgICAgPSAwLAoJLnR1bmVyICAgICAgICAgICAgPSAtMSwKCS5zdmhzICAgICAgICAgICAgID0gLTEsCgkuZ3Bpb21hc2sgICAgICAgICA9IDB4MCwKCS5tdXhzZWwgICAgICAgICAgID0geyAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLAoJCQkgICAgICAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzIH0sCgkubXV4c2VsX2hvb2sgICAgICA9IHNpZ21hU1FfbXV4c2VsLAoJLmF1ZGlvbXV4ICAgICAgICAgPSB7IDAgfSwKCS5ub19tc3AzNHh4ICAgICAgID0gMSwKCS5wbGwgICAgICAgICAgICAgID0gUExMXzI4LAoJLnR1bmVyX3R5cGUgICAgICAgPSAtMSwKfSx7CgkvKiBhbmRyZS5zY2h3YXJ6QG1hdHJpeC12aXNpb24uZGUgKi8KCS5uYW1lICAgICAgICAgICAgID0gIk1BVFJJWCBWaXNpb24gU2lnbWEtU0xDIiwKCS52aWRlb19pbnB1dHMgICAgID0gNCwKCS5hdWRpb19pbnB1dHMgICAgID0gMCwKCS50dW5lciAgICAgICAgICAgID0gLTEsCgkuc3ZocyAgICAgICAgICAgICA9IC0xLAoJLmdwaW9tYXNrICAgICAgICAgPSAweDAsCgkubXV4c2VsICAgICAgICAgICA9IHsgMiwgMiwgMiwgMiB9LAoJLm11eHNlbF9ob29rICAgICAgPSBzaWdtYVNMQ19tdXhzZWwsCgkuYXVkaW9tdXggICAgICAgICA9IHsgMCB9LAoJLm5vX21zcDM0eHggICAgICAgPSAxLAoJLnBsbCAgICAgICAgICAgICAgPSBQTExfMjgsCgkudHVuZXJfdHlwZSAgICAgICA9IC0xLAp9LHsKCS8qIEJUVFZfQVBBQ19WSUVXQ09NUCAqLwoJLyogQXR0aWxhIEtvbmRvcm9zIDxhdHRpbGEua29uZG9yb3NAY2hlbGxvLmh1PiAqLwoJLyogYnQ4NzggVFYgKyBGTSAweDAwMDAwMDAwIHN1YnN5c3RlbSBJRCAqLwoJLm5hbWUgICAgICAgICAgID0gIkFQQUMgVmlld2NvbXAgODc4KEFNQVgpIiwKCS52aWRlb19pbnB1dHMgICA9IDIsCgkuYXVkaW9faW5wdXRzICAgPSAxLAoJLnR1bmVyICAgICAgICAgID0gMCwKCS5zdmhzICAgICAgICAgICA9IC0xLAoJLmdwaW9tYXNrICAgICAgID0gMHhGRiwKCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMX0sCgkuYXVkaW9tdXggICAgICAgPSB7IDIsIDAsIDAsIDAsIDEwfSwKCS5uZWVkc190dmF1ZGlvICA9IDAsCgkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX1BBTCwKCS5oYXNfcmVtb3RlICAgICA9IDEsICAgLyogbWluaXJlbW90ZSB3b3Jrcywgc2VlIGlyLWtiZC1ncGlvLmMgKi8KCS5oYXNfcmFkaW8gICAgICA9IDEsICAgLyogbm90IGV2ZXJ5IGNhcmQgaGFzIHJhZGlvICovCn0sewoKCS8qIC0tLS0gY2FyZCAweDgwIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCS8qIENocmlzIFBhc2NvZSA8Yy5wYXNjb2VAaXRlZS51cS5lZHUuYXU+ICovCgkubmFtZSAgICAgICAgICAgPSAiRFZJQ08gRnVzaW9uSERUViBEVkItVCBMaXRlIiwKCS50dW5lciAgICAgICAgICA9IC0xLAoJLm5vX21zcDM0eHggICAgID0gMSwKCS5ub190ZGE5ODc1ICAgICA9IDEsCgkubm9fdGRhNzQzMiAgICAgPSAxLAoJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJLm5vX3ZpZGVvICAgICAgID0gMSwKCS5oYXNfZHZiICAgICAgICA9IDEsCgkudHVuZXJfdHlwZSAgICAgPSAtMSwKfSx7CgkvKiBTdGV2ZW4gPHBob3RvbjM4QHBjaG9tZS5jb20udHc+ICovCgkubmFtZSAgICAgICAgICAgPSAiVi1HZWFyIE15VkNEIiwKCS52aWRlb19pbnB1dHMgICA9IDMsCgkuYXVkaW9faW5wdXRzICAgPSAxLAoJLnR1bmVyICAgICAgICAgID0gMCwKCS5zdmhzICAgICAgICAgICA9IDIsCgkuZ3Bpb21hc2sgICAgICAgPSAweDNmLAoJLm11eHNlbCAgICAgICAgID0gezIsIDMsIDEsIDB9LAoJLmF1ZGlvbXV4ICAgICAgID0gezB4MzEsIDB4MzEsIDB4MzEsIDB4MzEsIDB4MzEsIDB4MzF9LAoJLm5vX21zcDM0eHggICAgID0gMSwKCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfTlRTQ19NLAoJLmhhc19yYWRpbyAgICAgID0gMCwKCS8vIC5oYXNfcmVtb3RlICAgICA9IDEsCn0sewoJLyogUmljayBDIDxjcnlwdGRyYWdvb25AZ21haWwuY29tPiAqLwogICAgICAgIC5uYW1lICAgICAgICAgICA9ICJTdXBlciBUViBUdW5lciIsCiAgICAgICAgLnZpZGVvX2lucHV0cyAgID0gNCwKICAgICAgICAuYXVkaW9faW5wdXRzICAgPSAxLAogICAgICAgIC50dW5lciAgICAgICAgICA9IDAsCiAgICAgICAgLnN2aHMgICAgICAgICAgID0gMiwKICAgICAgICAubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDB9LAogICAgICAgIC50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfTlRTQywKICAgICAgICAuZ3Bpb21hc2sgICAgICAgPSAweDAwODAwNywKICAgICAgICAuYXVkaW9tdXggICAgICAgPSB7IDAsIDB4MDAwMDAxLDAsMCwgMH0sCiAgICAgICAgLm5lZWRzX3R2YXVkaW8gID0gMSwKICAgICAgICAuaGFzX3JhZGlvICAgICAgPSAxLAp9LHsKCQkvKiBDaHJpcyBGYW5uaW5nIDx2aWRlbzRsaW51eEBoYXlkb24ubmV0PiAqLwoJCS5uYW1lICAgICAgICAgICA9ICJUaWJldCBTeXN0ZW1zICdQcm9ncmVzcyBEVlInIENTMTYiLAoJCS52aWRlb19pbnB1dHMgICA9IDE2LAoJCS5hdWRpb19pbnB1dHMgICA9IDAsCgkJLnR1bmVyICAgICAgICAgID0gLTEsCgkJLnN2aHMgICAgICAgICAgID0gLTEsCgkJLm11eHNlbCAgICAgICAgID0geyAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyIH0sCgkJLnBsbAkJPSBQTExfMjgsCgkJLm5vX21zcDM0eHggICAgID0gMSwKCQkubm9fdGRhOTg3NSAgICAgPSAxLAoJCS5ub190ZGE3NDMyCT0gMSwKCQkudHVuZXJfdHlwZSAgICAgPSAtMSwKCQkubXV4c2VsX2hvb2sgICAgPSB0aWJldENTMTZfbXV4c2VsLAp9LAp7CgkvKiBCaWxsIEJyYWNrIDx3YnJhY2tAbW1tLmNvbS5oaz4gKi8KCS8qCgkgKiBOb3RlIHRoYXQsIGJlY2F1c2Ugb2YgdGhlIGNhcmQncyB3aXJpbmcsIHRoZSAibWFzdGVyIgoJICogQlQ4NzhBIGNoaXAgKGkuZS4gdGhlIG9uZSB3aGljaCBjb250cm9scyB0aGUgYW5hbG9nIHN3aXRjaAoJICogYW5kIG11c3QgdXNlIHRoaXMgY2FyZCB0eXBlKSBpcyB0aGUgMm5kIG9uZSBkZXRlY3RlZC4gIFRoZQoJICogb3RoZXIgMyBjaGlwcyBzaG91bGQgdXNlIGNhcmQgdHlwZSAweDg1LCB3aG9zZSBkZXNjcmlwdGlvbgoJICogZm9sbG93cyB0aGlzIG9uZS4gIFRoZXJlIGlzIGEgRUVQUk9NIG9uIHRoZSBjYXJkICh3aGljaCBpcwoJICogY29ubmVjdGVkIHRvIHRoZSBJMkMgb2Ygb25lIG9mIHRob3NlIG90aGVyIGNoaXBzKSwgYnV0IGlzCgkgKiBub3QgY3VycmVudGx5IGhhbmRsZWQuICBUaGVyZSBpcyBhbHNvIGEgZmFjaWxpdHkgZm9yIGEKCSAqICJtb25pdG9yIiwgd2hpY2ggaXMgYWxzbyBub3QgY3VycmVudGx5IGltcGxlbWVudGVkLgoJICovCgkubmFtZQkJPSAiS29kaWNvbSA0NDAwUiAobWFzdGVyKSIsCgkudmlkZW9faW5wdXRzCT0gMTYsCgkuYXVkaW9faW5wdXRzCT0gMCwKCS50dW5lcgkJPSAtMSwKCS50dW5lcl90eXBlCT0gLTEsCgkuc3ZocwkJPSAtMSwKCS8qIEdQSU8gYml0cyAwLTkgdXNlZCBmb3IgYW5hbG9nIHN3aXRjaDoKCSAqICAgMDAgLSAwMzoJY2FtZXJhIHNlbGVjdG9yCgkgKiAgIDA0IC0gMDY6CWNoYW5uZWwgKGNvbnRyb2xsZXIpIHNlbGVjdG9yCgkgKiAgIDA3OglkYXRhICgxLT5vbiwgMC0+b2ZmKQoJICogICAwODoJc3Ryb2JlCgkgKiAgIDA5OglyZXNldAoJICogYml0IDE2IGlzIGlucHV0IGZyb20gc3luYyBzZXBhcmF0b3IgZm9yIHRoZSBjaGFubmVsCgkgKi8KCS5ncGlvbWFzawk9IDB4MDAwM2ZmLAoJLm5vX2dwaW9pcnEgICAgID0gMSwKCS5tdXhzZWwJCT0geyAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzIH0sCgkucGxsCQk9IFBMTF8yOCwKCS5ub19tc3AzNHh4CT0gMSwKCS5ub190ZGE3NDMyCT0gMSwKCS5ub190ZGE5ODc1CT0gMSwKCS5tdXhzZWxfaG9vawk9IGtvZGljb200NDAwcl9tdXhzZWwsCn0sCnsKCS8qIEJpbGwgQnJhY2sgPHdicmFja0BtbW0uY29tLmhrPiAqLwoJLyogTm90ZSB0aGF0LCBmb3IgcmVhc29ucyB1bmtub3duLCB0aGUgIm1hc3RlciIgQlQ4NzhBIGNoaXAgKGkuZS4gdGhlCgkgKiBvbmUgd2hpY2ggY29udHJvbHMgdGhlIGFuYWxvZyBzd2l0Y2gsIGFuZCBtdXN0IHVzZSB0aGUgY2FyZCB0eXBlKQoJICogaXMgdGhlIDJuZCBvbmUgZGV0ZWN0ZWQuICBUaGUgb3RoZXIgMyBjaGlwcyBzaG91bGQgdXNlIHRoaXMgY2FyZAoJICogdHlwZQoJICovCgkubmFtZQkJPSAiS29kaWNvbSA0NDAwUiAoc2xhdmUpIiwKCS52aWRlb19pbnB1dHMJPSAxNiwKCS5hdWRpb19pbnB1dHMJPSAwLAoJLnR1bmVyCQk9IC0xLAoJLnR1bmVyX3R5cGUJPSAtMSwKCS5zdmhzCQk9IC0xLAoJLmdwaW9tYXNrCT0gMHgwMTAwMDAsCgkubm9fZ3Bpb2lycSAgICAgPSAxLAoJLm11eHNlbAkJPSB7IDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMgfSwKCS5wbGwJCT0gUExMXzI4LAoJLm5vX21zcDM0eHgJPSAxLAoJLm5vX3RkYTc0MzIJPSAxLAoJLm5vX3RkYTk4NzUJPSAxLAoJLm11eHNlbF9ob29rCT0ga29kaWNvbTQ0MDByX211eHNlbCwKfX07CgpzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGJ0dHZfbnVtX3R2Y2FyZHMgPSBBUlJBWV9TSVpFKGJ0dHZfdHZjYXJkcyk7CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKc3RhdGljIHVuc2lnbmVkIGNoYXIgZWVwcm9tX2RhdGFbMjU2XTsKCi8qCiAqIGlkZW50aWZ5IGNhcmQKICovCnZvaWQgX19kZXZpbml0IGJ0dHZfaWRjYXJkKHN0cnVjdCBidHR2ICpidHYpCnsKCXVuc2lnbmVkIGludCBncGlvYml0czsKCWludCBpLHR5cGU7Cgl1bnNpZ25lZCBzaG9ydCB0bXA7CgoJLyogcmVhZCBQQ0kgc3Vic3lzdGVtIElEICovCglwY2lfcmVhZF9jb25maWdfd29yZChidHYtPmMucGNpLCBQQ0lfU1VCU1lTVEVNX0lELCAmdG1wKTsKCWJ0di0+Y2FyZGlkID0gdG1wIDw8IDE2OwoJcGNpX3JlYWRfY29uZmlnX3dvcmQoYnR2LT5jLnBjaSwgUENJX1NVQlNZU1RFTV9WRU5ET1JfSUQsICZ0bXApOwoJYnR2LT5jYXJkaWQgfD0gdG1wOwoKCWlmICgwICE9IGJ0di0+Y2FyZGlkICYmIDB4ZmZmZmZmZmYgIT0gYnR2LT5jYXJkaWQpIHsKCQkvKiBsb29rIGZvciB0aGUgY2FyZCAqLwoJCWZvciAodHlwZSA9IC0xLCBpID0gMDsgY2FyZHNbaV0uaWQgIT0gMDsgaSsrKQoJCQlpZiAoY2FyZHNbaV0uaWQgID09IGJ0di0+Y2FyZGlkKQoJCQkJdHlwZSA9IGk7CgoJCWlmICh0eXBlICE9IC0xKSB7CgkJCS8qIGZvdW5kIGl0ICovCgkJCXByaW50ayhLRVJOX0lORk8gImJ0dHYlZDogZGV0ZWN0ZWQ6ICVzIFtjYXJkPSVkXSwgIgoJCQkgICAgICAgIlBDSSBzdWJzeXN0ZW0gSUQgaXMgJTA0eDolMDR4XG4iLAoJCQkgICAgICAgYnR2LT5jLm5yLGNhcmRzW3R5cGVdLm5hbWUsY2FyZHNbdHlwZV0uY2FyZG5yLAoJCQkgICAgICAgYnR2LT5jYXJkaWQgJiAweGZmZmYsCgkJCSAgICAgICAoYnR2LT5jYXJkaWQgPj4gMTYpICYgMHhmZmZmKTsKCQkJYnR2LT5jLnR5cGUgPSBjYXJkc1t0eXBlXS5jYXJkbnI7CgkJfSBlbHNlIHsKCQkJLyogNDA0ICovCgkJCXByaW50ayhLRVJOX0lORk8gImJ0dHYlZDogc3Vic3lzdGVtOiAlMDR4OiUwNHggKFVOS05PV04pXG4iLAoJCQkgICAgICAgYnR2LT5jLm5yLCBidHYtPmNhcmRpZCAmIDB4ZmZmZiwKCQkJICAgICAgIChidHYtPmNhcmRpZCA+PiAxNikgJiAweGZmZmYpOwoJCQlwcmludGsoS0VSTl9ERUJVRyAicGxlYXNlIG1haWwgaWQsIGJvYXJkIG5hbWUgYW5kICIKCQkJICAgICAgICJ0aGUgY29ycmVjdCBjYXJkPSBpbnNtb2Qgb3B0aW9uIHRvIGtyYXhlbEBieXRlc2V4Lm9yZ1xuIik7CgkJfQoJfQoKCS8qIGxldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgYXV0b2RldGVjdGVkIHR5cGUgKi8KCWlmIChjYXJkW2J0di0+Yy5ucl0gPCBidHR2X251bV90dmNhcmRzKQoJCWJ0di0+Yy50eXBlPWNhcmRbYnR2LT5jLm5yXTsKCgkvKiBwcmludCB3aGljaCBjYXJkIGNvbmZpZyB3ZSBhcmUgdXNpbmcgKi8KCXByaW50ayhLRVJOX0lORk8gImJ0dHYlZDogdXNpbmc6ICVzIFtjYXJkPSVkLCVzXVxuIixidHYtPmMubnIsCgkgICAgICAgYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5uYW1lLCBidHYtPmMudHlwZSwKCSAgICAgICBjYXJkW2J0di0+Yy5ucl0gPCBidHR2X251bV90dmNhcmRzCgkgICAgICAgPyAiaW5zbW9kIG9wdGlvbiIgOiAiYXV0b2RldGVjdGVkIik7CgoJLyogb3ZlcndyaXRlIGdwaW8gc3R1ZmYgPz8gKi8KCWlmIChVTlNFVCA9PSBhdWRpb2FsbCAmJiBVTlNFVCA9PSBhdWRpb211eFswXSkKCQlyZXR1cm47CgoJaWYgKFVOU0VUICE9IGF1ZGlvbXV4WzBdKSB7CgkJZ3Bpb2JpdHMgPSAwOwoJCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspIHsKCQkJYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5hdWRpb211eFtpXSA9IGF1ZGlvbXV4W2ldOwoJCQlncGlvYml0cyB8PSBhdWRpb211eFtpXTsKCQl9Cgl9IGVsc2UgewoJCWdwaW9iaXRzID0gYXVkaW9hbGw7CgkJZm9yIChpID0gMDsgaSA8IDU7IGkrKykgewoJCQlidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLmF1ZGlvbXV4W2ldID0gYXVkaW9hbGw7CgkJfQoJfQoJYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5ncGlvbWFzayA9IChVTlNFVCAhPSBncGlvbWFzaykgPyBncGlvbWFzayA6IGdwaW9iaXRzOwoJcHJpbnRrKEtFUk5fSU5GTyAiYnR0diVkOiBncGlvIGNvbmZpZyBvdmVycmlkZTogbWFzaz0weCV4LCBtdXg9IiwKCSAgICAgICBidHYtPmMubnIsYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5ncGlvbWFzayk7Cglmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKSB7CgkJcHJpbnRrKCIlczB4JXgiLCBpID8gIiwiIDogIiIsIGJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0uYXVkaW9tdXhbaV0pOwoJfQoJcHJpbnRrKCJcbiIpOwp9CgovKgogKiAobW9zdCkgYm9hcmQgc3BlY2lmaWMgaW5pdGlhbGlzYXRpb25zIGdvZXMgaGVyZQogKi8KCi8qIFNvbWUgTW9kdWxhciBUZWNobm9sb2d5IGNhcmRzIGhhdmUgYW4gZWVwcm9tLCBidXQgbm8gc3Vic3lzdGVtIElEICovCnZvaWQgaWRlbnRpZnlfYnlfZWVwcm9tKHN0cnVjdCBidHR2ICpidHYsIHVuc2lnbmVkIGNoYXIgZWVwcm9tX2RhdGFbMjU2XSkKewoJaW50IHR5cGUgPSAtMTsKCglpZiAoMCA9PSBzdHJuY21wKGVlcHJvbV9kYXRhLCJHRVQgTU0yMHhQQ1RWIiwxMykpCgkJdHlwZSA9IEJUVFZfTU9EVEVDXzIwNTsKCWVsc2UgaWYgKDAgPT0gc3RybmNtcChlZXByb21fZGF0YSsyMCwiUGljb2xvIiw3KSkKCQl0eXBlID0gQlRUVl9FVVJFU1lTX1BJQ09MTzsKCWVsc2UgaWYgKGVlcHJvbV9kYXRhWzBdID09IDB4ODQgJiYgZWVwcm9tX2RhdGFbMl09PSAwKQogICAgICAgICAgICAgICAgdHlwZSA9IEJUVFZfSEFVUFBBVUdFOyAvKiBvbGQgYnQ4NDggKi8KCglpZiAoLTEgIT0gdHlwZSkgewoJCWJ0di0+Yy50eXBlID0gdHlwZTsKCQlwcmludGsoImJ0dHYlZDogZGV0ZWN0ZWQgYnkgZWVwcm9tOiAlcyBbY2FyZD0lZF1cbiIsCgkJICAgICAgIGJ0di0+Yy5uciwgYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5uYW1lLCBidHYtPmMudHlwZSk7Cgl9Cn0KCnN0YXRpYyB2b2lkIGZseXZpZGVvX2dwaW8oc3RydWN0IGJ0dHYgKmJ0dikKewoJaW50IGdwaW8saGFzX3JlbW90ZSxoYXNfcmFkaW8saXNfY2FwdHVyZV9vbmx5LGlzX2xyOTAsaGFzX3RkYTk4MjBfdGRhOTgyMTsKCWludCB0dW5lcj0tMSx0dHlwZTsKCglncGlvX2lub3V0KDB4ZmZmZmZmLCAwKTsKCXVkZWxheSg4KTsgIC8vIHdpdGhvdXQgdGhpcyB3ZSB3b3VsZCBzZWUgdGhlIDB4MTgwMCBtYXNrCglncGlvID0gZ3Bpb19yZWFkKCk7CgkvKiBGSVhNRTogbXVzdCByZXN0b3JlIE9VUl9FTiA/Pz8gKi8KCgkvLyBhbGwgY2FyZHMgcHJvdmlkZSBHUElPIGluZm8sIHNvbWUgaGF2ZSBhbiBhZGRpdGlvbmFsIGVlcHJvbQoJLy8gTFI1MDogR1BJTyBjb2RpbmcgY2FuIGJlIGZvdW5kIGxvd2VyIHJpZ2h0IENQMSAuLiBDUDkKCS8vICAgICAgIENQOT1HUElPMjMgLi4gQ1AxPUdQSU8xNTsgd2hlbiBPUEVOLCB0aGUgY29ycmVzcG9uZGluZyBHUElPIHJlYWRzIDEuCgkvLyAgICAgICBHUElPMTQtMTI6IG4uYy4KCS8vIExSOTA6IEdQOT1HUElPMjMgLi4gR1AxPUdQSU8xNSAocmlnaHQgYWJvdmUgdGhlIGJ0ODc4KQoKCS8vIGxvd2VzdCAzIGJ5dGVzIGFyZSByZW1vdGUgY29udHJvbCBjb2RlcyAobm8gaGFuZHNoYWtlIG5lZWRlZCkKICAgICAgICAvLyB4eHhGRkY6IE5vIHJlbW90ZSBjb250cm9sIGNoaXAgc29sZGVyZWQKICAgICAgICAvLyB4eHhGMDAoTFIyNi9MUjUwKSwgeHh4RkUwKExSOTApOiBSZW1vdGUgY29udHJvbCBjaGlwIChMVkEwMDEgb3IgQ0Y0NSkgc29sZGVyZWQKCS8vIE5vdGU6IFNvbWUgYml0cyBhcmUgQXVkaW9fTWFzayAhCgoJdHR5cGU9KGdwaW8mMHgwZjAwMDApPj4xNjsKCXN3aXRjaCh0dHlwZSkgewoJY2FzZSAweDA6IHR1bmVyPTI7IC8vIE5UU0MsIGUuZy4gVFBJOE5TUjExUAoJCWJyZWFrOwogICAgICAgIGNhc2UgMHgyOiB0dW5lcj0zOTsvLyBMRyBOVFNDIChuZXdlciBUQVBDIHNlcmllcykgVEFQQy1INzAxUAoJCWJyZWFrOwoJY2FzZSAweDQ6IHR1bmVyPTU7IC8vIFBoaWxpcHMgUEFMIFRQSThQU0IwMlAsIFRQSThQU0IxMlAsIFRQSThQU0IxMkQgb3IgRkkxMjE2LCBGTTEyMTYKCQlicmVhazsKCWNhc2UgMHg2OiB0dW5lcj0zNzsgLy8gTEcgUEFMIChuZXdlciBUQVBDIHNlcmllcykgVEFQQy1HNzAyUAoJCWJyZWFrOwoJY2FzZSAweEM6IHR1bmVyPTM7IC8vIFBoaWxpcHMgU0VDQU0oK1BBTCkgRlExMjE2TUUgb3IgRkkxMjE2TUYKCQlicmVhazsKCWRlZmF1bHQ6CgkJcHJpbnRrKEtFUk5fSU5GTyAiYnR0diVkOiBGbHlWaWRlb19ncGlvOiB1bmtub3duIHR1bmVyIHR5cGUuXG4iLCBidHYtPmMubnIpOwoJfQoKCWhhc19yZW1vdGUgICAgICAgICAgPSAgIGdwaW8gJiAweDgwMDAwMDsKCWhhc19yYWRpbwkgICAgPSAgIGdwaW8gJiAweDQwMDAwMDsKCS8vICAgdW5rbm93biAgICAgICAgICAgICAgICAgICAweDIwMDAwMDsKCS8vICAgdW5rbm93bjIgICAgICAgICAgICAgICAgICAweDEwMDAwMDsKICAgICAgICBpc19jYXB0dXJlX29ubHkgICAgID0gIShncGlvICYgMHgwMDgwMDApOyAvL0dQSU8xNQoJaGFzX3RkYTk4MjBfdGRhOTgyMSA9ICEoZ3BpbyAmIDB4MDA0MDAwKTsKCWlzX2xyOTAgICAgICAgICAgICAgPSAhKGdwaW8gJiAweDAwMjAwMCk7IC8vIGVsc2UgTFIyNi9MUjUwIChMUjM4L0xSNTEgZi4gY2FwdHVyZSBvbmx5KQogICAgICAgIC8vCQkgICAgICAgIGdwaW8gJiAweDAwMTAwMCAvLyBvdXRwdXQgYml0IGZvciBhdWRpbyByb3V0aW5nCgoJaWYoaXNfY2FwdHVyZV9vbmx5KQoJCXR1bmVyPTQ7IC8vIE5vIHR1bmVyIHByZXNlbnQKCglwcmludGsoS0VSTl9JTkZPICJidHR2JWQ6IEZseVZpZGVvIFJhZGlvPSVzIFJlbW90ZUNvbnRyb2w9JXMgVHVuZXI9JWQgZ3Bpbz0weCUwNnhcbiIsCgkgICAgICAgYnR2LT5jLm5yLCBoYXNfcmFkaW8/ICJ5ZXMiOiJubyAiLCBoYXNfcmVtb3RlPyAieWVzIjoibm8gIiwgdHVuZXIsIGdwaW8pOwoJcHJpbnRrKEtFUk5fSU5GTyAiYnR0diVkOiBGbHlWaWRlbyAgTFI5MD0lcyB0ZGE5ODIxL3RkYTk4MjA9JXMgY2FwdHVyZV9vbmx5PSVzXG4iLAoJCWJ0di0+Yy5uciwgaXNfbHI5MD8ieWVzIjoibm8gIiwgaGFzX3RkYTk4MjBfdGRhOTgyMT8ieWVzIjoibm8gIiwKCQlpc19jYXB0dXJlX29ubHk/InllcyI6Im5vICIpOwoKCWlmKHR1bmVyIT0gLTEpIC8vIG9ubHkgc2V0IGlmIGtub3duIHR1bmVyIGF1dG9kZXRlY3RlZCwgZWxzZSBsZXQgaW5zbW9kIG9wdGlvbiB0aHJvdWdoCgkJYnR2LT50dW5lcl90eXBlID0gdHVuZXI7CglidHYtPmhhc19yYWRpbyA9IGhhc19yYWRpbzsKCgkvLyBMUjkwIEF1ZGlvIFJvdXRpbmcgaXMgZG9uZSBieSAyIGhlZjQwNTIsIHNvIEF1ZGlvX01hc2sgaGFzIDQgYml0czogMHgwMDFjODAKICAgICAgICAvLyBMUjI2L0xSNTAgb25seSBoYXMgMSBoZWY0MDUyLCBBdWRpb19NYXNrIDB4MDAwYzAwCgkvLyBBdWRpbyBvcHRpb25zOiBmcm9tIHR1bmVyLCBmcm9tIHRkYTk4MjEvdGRhOTgyMShtb25vLHN0ZXJlbyxzYXApLCBmcm9tIHRkYTk4NzQsIGV4dC4sIG11dGUKCWlmKGhhc190ZGE5ODIwX3RkYTk4MjEpIGJ0di0+YXVkaW9faG9vayA9IGx0OTQxNV9hdWRpbzsKCS8vdG9kbzogaWYoaGFzX3RkYTk4NzQpIGJ0di0+YXVkaW9faG9vayA9IGZ2MjAwMHNfYXVkaW87Cn0KCnN0YXRpYyBpbnQgbWlyb190dW5lcm1hcFtdID0geyAwLDYsMiwzLCAgIDQsNSw2LDAsICAzLDAsNCw1LCAgNSwyLDE2LDEsCgkJCSAgICAgICAxNCwyLDE3LDEsIDQsMSw0LDMsICAxLDIsMTYsMSwgNCw0LDQsNCB9OwpzdGF0aWMgaW50IG1pcm9fZm10dW5lcltdICA9IHsgMCwwLDAsMCwgICAwLDAsMCwwLCAgMCwwLDAsMCwgIDAsMCwwLDEsCgkJCSAgICAgICAxLDEsMSwxLCAgIDEsMSwxLDAsICAwLDAsMCwwLCAgMCwxLDAsMCB9OwoKc3RhdGljIHZvaWQgbWlyb19waW5uYWNsZV9ncGlvKHN0cnVjdCBidHR2ICpidHYpCnsKCWludCBpZCxtc3AsZ3BpbzsKCWNoYXIgKmluZm87CgoJZ3Bpb19pbm91dCgweGZmZmZmZiwgMCk7CiAgICAgICAgZ3BpbyA9IGdwaW9fcmVhZCgpOwoJaWQgICA9ICgoZ3Bpbz4+MTApICYgNjMpIC0xOwoJbXNwICA9IGJ0dHZfSTJDUmVhZChidHYsIEkyQ19NU1AzNDAwLCAiTVNQMzR4eCIpOwoJaWYgKGlkIDwgMzIpIHsKCQlidHYtPnR1bmVyX3R5cGUgPSBtaXJvX3R1bmVybWFwW2lkXTsKCQlpZiAoMCA9PSAoZ3BpbyAmIDB4MjApKSB7CgkJCWJ0di0+aGFzX3JhZGlvID0gMTsKCQkJaWYgKCFtaXJvX2ZtdHVuZXJbaWRdKSB7CgkJCQlidHYtPmhhc19tYXRjaGJveCA9IDE7CgkJCQlidHYtPm1ib3hfd2UgICAgPSAoMTw8Nik7CgkJCQlidHYtPm1ib3hfbW9zdCAgPSAoMTw8Nyk7CgkJCQlidHYtPm1ib3hfY2xrICAgPSAoMTw8OCk7CgkJCQlidHYtPm1ib3hfZGF0YSAgPSAoMTw8OSk7CgkJCQlidHYtPm1ib3hfbWFzayAgPSAoMTw8Nil8KDE8PDcpfCgxPDw4KXwoMTw8OSk7CgkJCX0KCQl9IGVsc2UgewoJCQlidHYtPmhhc19yYWRpbyA9IDA7CgkJfQoJCWlmICgtMSAhPSBtc3ApIHsKCQkJaWYgKGJ0di0+Yy50eXBlID09IEJUVFZfTUlSTykKCQkJCWJ0di0+Yy50eXBlID0gQlRUVl9NSVJPUFJPOwoJCQlpZiAoYnR2LT5jLnR5cGUgPT0gQlRUVl9QSU5OQUNMRSkKCQkJCWJ0di0+Yy50eXBlID0gQlRUVl9QSU5OQUNMRVBSTzsKCQl9CgkJcHJpbnRrKEtFUk5fSU5GTwoJCSAgICAgICAiYnR0diVkOiBtaXJvOiBpZD0lZCB0dW5lcj0lZCByYWRpbz0lcyBzdGVyZW89JXNcbiIsCgkJICAgICAgIGJ0di0+Yy5uciwgaWQrMSwgYnR2LT50dW5lcl90eXBlLAoJCSAgICAgICAhYnR2LT5oYXNfcmFkaW8gPyAibm8iIDoKCQkgICAgICAgKGJ0di0+aGFzX21hdGNoYm94ID8gIm1hdGNoYm94IiA6ICJmbXR1bmVyIiksCgkJICAgICAgICgtMSA9PSBtc3ApID8gIm5vIiA6ICJ5ZXMiKTsKCX0gZWxzZSB7CgkJLyogbmV3IGNhcmRzIHdpdGggbWljcm90dW5lIHR1bmVyICovCgkJaWQgPSA2MyAtIGlkOwoJCWJ0di0+aGFzX3JhZGlvID0gMDsKCQlzd2l0Y2ggKGlkKSB7CgkJY2FzZSAxOgoJCQlpbmZvID0gIlBBTCAvIG1vbm8iOwoJCQlicmVhazsKCQljYXNlIDI6CgkJCWluZm8gPSAiUEFMK1NFQ0FNIC8gc3RlcmVvIjsKCQkJYnR2LT5oYXNfcmFkaW8gPSAxOwoJCQlicmVhazsKCQljYXNlIDM6CgkJCWluZm8gPSAiTlRTQyAvIHN0ZXJlbyI7CgkJCWJ0di0+aGFzX3JhZGlvID0gMTsKCQkJYnJlYWs7CgkJY2FzZSA0OgoJCQlpbmZvID0gIlBBTCtTRUNBTSAvIG1vbm8iOwoJCQlicmVhazsKCQljYXNlIDU6CgkJCWluZm8gPSAiTlRTQyAvIG1vbm8iOwoJCQlicmVhazsKCQljYXNlIDY6CgkJCWluZm8gPSAiTlRTQyAvIHN0ZXJlbyI7CgkJCWJyZWFrOwoJCWNhc2UgNzoKCQkJaW5mbyA9ICJQQUwgLyBzdGVyZW8iOwoJCQlicmVhazsKCQlkZWZhdWx0OgoJCQlpbmZvID0gIm9vcHM6IHVua25vd24gY2FyZCI7CgkJCWJyZWFrOwoJCX0KCQlpZiAoLTEgIT0gbXNwKQoJCQlidHYtPmMudHlwZSA9IEJUVFZfUElOTkFDTEVQUk87CgkJcHJpbnRrKEtFUk5fSU5GTwoJCSAgICAgICAiYnR0diVkOiBwaW5uYWNsZS9tdDogaWQ9JWQgaW5mbz1cIiVzXCIgcmFkaW89JXNcbiIsCgkJICAgICAgIGJ0di0+Yy5uciwgaWQsIGluZm8sIGJ0di0+aGFzX3JhZGlvID8gInllcyIgOiAibm8iKTsKCQlidHYtPnR1bmVyX3R5cGUgID0gMzM7CgkJYnR2LT5waW5uYWNsZV9pZCA9IGlkOwoJfQp9CgovKiBHUElPMjEgICBMOiBCdWZmZXIgYWt0aXYsIEg6IEJ1ZmZlciBpbmFrdGl2ICovCiNkZWZpbmUgTE0xODgyX1NZTkNfRFJJVkUgICAgIDB4MjAwMDAwTAoKc3RhdGljIHZvaWQgaW5pdF9pZHNfZWFnbGUoc3RydWN0IGJ0dHYgKmJ0dikKewoJZ3Bpb19pbm91dCgweGZmZmZmZiwweEZGRkYzNyk7CglncGlvX3dyaXRlKDB4MjAwMDIwKTsKCgkvKiBmbGFzaCBzdHJvYmUgaW52ZXJ0ZXIgPyEgKi8KCWdwaW9fd3JpdGUoMHgyMDAwMjQpOwoKCS8qIHN3aXRjaCBzeW5jIGRyaXZlIG9mZiAqLwoJZ3Bpb19iaXRzKExNMTg4Ml9TWU5DX0RSSVZFLExNMTg4Ml9TWU5DX0RSSVZFKTsKCgkvKiBzZXQgQlQ4NDggbXV4ZWwgdG8gMiAqLwoJYnRhb3IoKDIpPDw1LCB+KDI8PDUpLCBCVDg0OF9JRk9STSk7Cn0KCi8qIE11eHNlbCBoZWxwZXIgZm9yIHRoZSBJRFMgRWFnbGUuCiAqIHRoZSBlYWdsZXMgZG9lcyBub3QgdXNlIHRoZSBzdGFuZGFyZCBtdXhzZWwtYml0cyBidXQKICogaGFzIGl0cyBvd24gbXVsdGlwbGV4ZXIgKi8Kc3RhdGljIHZvaWQgZWFnbGVfbXV4c2VsKHN0cnVjdCBidHR2ICpidHYsIHVuc2lnbmVkIGludCBpbnB1dCkKewoJYnRhb3IoKDIpPDw1LCB+KDM8PDUpLCBCVDg0OF9JRk9STSk7CglncGlvX2JpdHMoMyxidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLm11eHNlbFtpbnB1dCY3XSk7CgojaWYgMAogICAgICAgLyogc3ZocyAqLwogICAgICAgLyogd2FrZSBjaHJvbWEgQURDICovCiAgICAgICBidGFuZCh+QlQ4NDhfQURDX0NfU0xFRVAsIEJUODQ4X0FEQyk7CiAgICAgICAvKiBzZXQgdG8gWUMgdmlkZW8gKi8KICAgICAgIGJ0b3IoQlQ4NDhfQ09OVFJPTF9DT01QLCBCVDg0OF9FX0NPTlRST0wpOwogICAgICAgYnRvcihCVDg0OF9DT05UUk9MX0NPTVAsIEJUODQ4X09fQ09OVFJPTCk7CiNlbHNlCiAgICAgICAvKiBjb21wb3NpdGUgKi8KICAgICAgIC8qIHNldCBjaHJvbWEgQURDIHRvIHNsZWVwICovCiAgICAgICBidG9yKEJUODQ4X0FEQ19DX1NMRUVQLCBCVDg0OF9BREMpOwogICAgICAgLyogc2V0IHRvIGNvbXBvc2l0ZSB2aWRlbyAqLwogICAgICAgYnRhbmQofkJUODQ4X0NPTlRST0xfQ09NUCwgQlQ4NDhfRV9DT05UUk9MKTsKICAgICAgIGJ0YW5kKH5CVDg0OF9DT05UUk9MX0NPTVAsIEJUODQ4X09fQ09OVFJPTCk7CiNlbmRpZgoKICAgICAgIC8qIHN3aXRjaCBzeW5jIGRyaXZlIG9mZiAqLwogICAgICAgZ3Bpb19iaXRzKExNMTg4Ml9TWU5DX0RSSVZFLExNMTg4Ml9TWU5DX0RSSVZFKTsKfQoKc3RhdGljIHZvaWQgZ3ZjMTEwMF9tdXhzZWwoc3RydWN0IGJ0dHYgKmJ0diwgdW5zaWduZWQgaW50IGlucHV0KQp7CiAgICAgICAgc3RhdGljIGNvbnN0IGludCBtYXNrc1tdID0gezB4MzAsIDB4MDEsIDB4MTIsIDB4MjN9OwoJZ3Bpb193cml0ZShtYXNrc1tpbnB1dCU0XSk7Cn0KCi8qIExNTEJUNHggaW5pdGlhbGl6YXRpb24gLSB0byBhbGxvdyBhY2Nlc3MgdG8gR1BJTyBiaXRzIGZvciBzZW5zb3JzIGlucHV0IGFuZAogICBhbGFybXMgb3V0cHV0CgogICBHUElPYml0ICAgIHwgMTAgfCA5IHwgOCB8IDcgfCA2IHwgNSB8IDQgfCAzIHwgMiB8IDEgfCAwIHwKICAgYXNzaWdubWVudCB8IFRJIHwgTzN8SU54fCBPMnwgTzF8SU40fElOM3xJTjJ8SU4xfCAgIHwgICB8CgogICBJTiAtIHNlbnNvciBpbnB1dHMsIElOeCAtIHNlbnNvciBpbnB1dHMgYW5kIFRJIFhPUmVkIHRvZ2V0aGVyCiAgIE8xLE8yLE8zIC0gYWxhcm0gb3V0cHV0cyAocmVsYXlzKQoKICAgT1VUIEVOQUJMRSAgIDEgICAgMSAgIDAgIC4gMSAgMSAgIDAgICAwIC4gMCAgIDAgICAwICAgIDAgICA9IDB4NkMwCgoqLwoKc3RhdGljIHZvaWQgaW5pdF9sbWxidDR4KHN0cnVjdCBidHR2ICpidHYpCnsKCXByaW50ayhLRVJOX0RFQlVHICJMTUxCVDR4IGluaXRcbiIpOwoJYnR3cml0ZSgweDAwMDAwMCwgQlQ4NDhfR1BJT19SRUdfSU5QKTsKCWdwaW9faW5vdXQoMHhmZmZmZmYsIDB4MDAwNkMwKTsKCWdwaW9fd3JpdGUoMHgwMDAwMDApOwp9CgpzdGF0aWMgdm9pZCBzaWdtYVNRX211eHNlbChzdHJ1Y3QgYnR0diAqYnR2LCB1bnNpZ25lZCBpbnQgaW5wdXQpCnsKCXVuc2lnbmVkIGludCBpbm11eCA9IGlucHV0ICUgODsKCWdwaW9faW5vdXQoIDB4ZiwgMHhmICk7CglncGlvX2JpdHMoIDB4ZiwgaW5tdXggKTsKfQoKc3RhdGljIHZvaWQgc2lnbWFTTENfbXV4c2VsKHN0cnVjdCBidHR2ICpidHYsIHVuc2lnbmVkIGludCBpbnB1dCkKewoJdW5zaWduZWQgaW50IGlubXV4ID0gaW5wdXQgJSA0OwoJZ3Bpb19pbm91dCggMzw8OSwgMzw8OSApOwoJZ3Bpb19iaXRzKCAzPDw5LCBpbm11eDw8OSApOwp9CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKc3RhdGljIHZvaWQgYnR0dl9yZXNldF9hdWRpbyhzdHJ1Y3QgYnR0diAqYnR2KQp7CgkvKgoJICogQlQ4NzhBIGhhcyBhIGF1ZGlvLXJlc2V0IHJlZ2lzdGVyLgoJICogMS4gVGhpcyByZWdpc3RlciBpcyBhbiBhdWRpbyByZXNldCBmdW5jdGlvbiBidXQgaXQgaXMgaW4KCSAqICAgIGZ1bmN0aW9uLTAgKHZpZGVvIGNhcHR1cmUpIGFkZHJlc3Mgc3BhY2UuCgkgKiAyLiBJdCBpcyBlbm91Z2ggdG8gZG8gdGhpcyBvbmNlIHBlciBwb3dlci11cCBvZiB0aGUgY2FyZC4KCSAqIDMuIFRoZXJlIGlzIGEgdHlwbyBpbiB0aGUgQ29uZXhhbnQgZG9jIC0tIGl0IGlzIG5vdCBhdAoJICogICAgMHg1QiwgYnV0IGF0IDB4MDU4LiAoQiBpcyBhbiBvZGQtbnVtYmVyLCBvYnZpb3VzbHkgYSB0eXBvISkuCgkgKiAtLS8vU2hyaWt1bWFyIDAzMDYwOQoJICovCglpZiAoYnR2LT5pZCAhPSA4NzgpCgkJcmV0dXJuOwoKCWlmIChidHR2X2RlYnVnKQoJCXByaW50aygiYnR0diVkOiBCVDg3OEEgQVJFU0VUXG4iLGJ0di0+Yy5ucik7CglidHdyaXRlKCgxPDw3KSwgMHgwNTgpOwoJdWRlbGF5KDEwKTsKCWJ0d3JpdGUoICAgICAwLCAweDA1OCk7Cn0KCi8qIGluaXRpYWxpemF0aW9uIHBhcnQgb25lIC0tIGJlZm9yZSByZWdpc3RlcmluZyBpMmMgYnVzICovCnZvaWQgX19kZXZpbml0IGJ0dHZfaW5pdF9jYXJkMShzdHJ1Y3QgYnR0diAqYnR2KQp7Cglzd2l0Y2ggKGJ0di0+Yy50eXBlKSB7CgljYXNlIEJUVFZfSEFVUFBBVUdFOgoJY2FzZSBCVFRWX0hBVVBQQVVHRTg3ODoKICAgICAgICAgICAgICAgIGJvb3RfbXNwMzR4eChidHYsNSk7CgkJYnJlYWs7CgljYXNlIEJUVFZfVk9PRE9PVFZfRk06CiAgICAgICAgICAgICAgICBib290X21zcDM0eHgoYnR2LDIwKTsKCQlicmVhazsKCWNhc2UgQlRUVl9BVkVSTUVESUE5ODoKCQlib290X21zcDM0eHgoYnR2LDExKTsKCQlicmVhazsKCWNhc2UgQlRUVl9IQVVQUEFVR0VQVlI6CgkJcHZyX2Jvb3QoYnR2KTsKCQlicmVhazsKCWNhc2UgQlRUVl9UV0lOSEFOX0RTVDoKCWNhc2UgQlRUVl9BVkRWQlRfNzcxOgoJCWJ0di0+dXNlX2kyY19odyA9IDE7CgkJYnJlYWs7Cgl9CglpZiAoIWJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0uaGFzX2R2YikKCQlidHR2X3Jlc2V0X2F1ZGlvKGJ0dik7Cn0KCi8qIGluaXRpYWxpemF0aW9uIHBhcnQgdHdvIC0tIGFmdGVyIHJlZ2lzdGVyaW5nIGkyYyBidXMgKi8Kdm9pZCBfX2RldmluaXQgYnR0dl9pbml0X2NhcmQyKHN0cnVjdCBidHR2ICpidHYpCnsKCWludCB0ZGE5ODg3OwogICAgICAgIGJ0di0+dHVuZXJfdHlwZSA9IC0xOwoKCWlmIChCVFRWX1VOS05PV04gPT0gYnR2LT5jLnR5cGUpIHsKCQlidHR2X3JlYWRlZShidHYsZWVwcm9tX2RhdGEsMHhhMCk7CgkJaWRlbnRpZnlfYnlfZWVwcm9tKGJ0dixlZXByb21fZGF0YSk7Cgl9CgoJc3dpdGNoIChidHYtPmMudHlwZSkgewoJY2FzZSBCVFRWX01JUk86CgljYXNlIEJUVFZfTUlST1BSTzoKCWNhc2UgQlRUVl9QSU5OQUNMRToKCWNhc2UgQlRUVl9QSU5OQUNMRVBSTzoKCQkvKiBtaXJvL3Bpbm5hY2xlICovCgkJbWlyb19waW5uYWNsZV9ncGlvKGJ0dik7CgkJYnJlYWs7CgljYXNlIEJUVFZfRkxZVklERU9fOTg6CgljYXNlIEJUVFZfTUFYSToKCWNhc2UgQlRUVl9MSUZFX0ZMWUtJVDoKCWNhc2UgQlRUVl9GTFlWSURFTzoKCWNhc2UgQlRUVl9UWVBIT09OX1RWSUVXOgoJY2FzZSBCVFRWX0NIUk9OT1NfVlMyOgoJY2FzZSBCVFRWX0ZMWVZJREVPXzk4Rk06CgljYXNlIEJUVFZfRkxZVklERU8yMDAwOgoJY2FzZSBCVFRWX0ZMWVZJREVPOThFWjoKCWNhc2UgQlRUVl9DT05GRVJFTkNFVFY6CgljYXNlIEJUVFZfTElGRVRFQ185NDE1OgoJCWZseXZpZGVvX2dwaW8oYnR2KTsKCQlicmVhazsKCWNhc2UgQlRUVl9IQVVQUEFVR0U6CgljYXNlIEJUVFZfSEFVUFBBVUdFODc4OgoJY2FzZSBCVFRWX0hBVVBQQVVHRVBWUjoKCQkvKiBwaWNrIHVwIHNvbWUgY29uZmlnIGluZm9zIGZyb20gdGhlIGVlcHJvbSAqLwoJCWJ0dHZfcmVhZGVlKGJ0dixlZXByb21fZGF0YSwweGEwKTsKICAgICAgICAgICAgICAgIGhhdXBwYXVnZV9lZXByb20oYnR2KTsKCQlicmVhazsKCWNhc2UgQlRUVl9BVkVSTUVESUE5ODoKCWNhc2UgQlRUVl9BVlBIT05FOTg6CgkJYnR0dl9yZWFkZWUoYnR2LGVlcHJvbV9kYXRhLDB4YTApOwoJCWF2ZXJtZWRpYV9lZXByb20oYnR2KTsKCQlicmVhazsKCWNhc2UgQlRUVl9QWEMyMDA6CgkJaW5pdF9QWEMyMDAoYnR2KTsKCQlicmVhazsKCWNhc2UgQlRUVl9QSUNPTE9fVEVUUkFfQ0hJUDoKCQlwaWNvbG9fdGV0cmFfaW5pdChidHYpOwoJCWJyZWFrOwoJY2FzZSBCVFRWX1ZIWDoKCQlidHYtPmhhc19yYWRpbyAgICA9IDE7CgkJYnR2LT5oYXNfbWF0Y2hib3ggPSAxOwoJCWJ0di0+bWJveF93ZSAgICAgID0gMHgyMDsKCQlidHYtPm1ib3hfbW9zdCAgICA9IDA7CgkJYnR2LT5tYm94X2NsayAgICAgPSAweDA4OwoJCWJ0di0+bWJveF9kYXRhICAgID0gMHgxMDsKCQlidHYtPm1ib3hfbWFzayAgICA9IDB4Mzg7CgkJYnJlYWs7CgljYXNlIEJUVFZfVk9CSVNfQk9PU1RBUjoKCWNhc2UgQlRUVl9URVJSQVRWOgoJCXRlcnJhdGVjX2FjdGl2ZV9yYWRpb191cGdyYWRlKGJ0dik7CgkJYnJlYWs7CgljYXNlIEJUVFZfTUFHSUNUVklFVzA2MToKCQlpZiAoYnR2LT5jYXJkaWQgPT0gMHgzMDAyMTQ0ZikgewoJCQlidHYtPmhhc19yYWRpbz0xOwoJCQlwcmludGsoImJ0dHYlZDogcmFkaW8gZGV0ZWN0ZWQgYnkgc3Vic3lzdGVtIGlkIChDUEgwNXgpXG4iLGJ0di0+Yy5ucik7CgkJfQoJCWJyZWFrOwogICAgICAgY2FzZSBCVFRWX1NUQjI6CiAgICAgICAgICAgICAgICBpZiAoYnR2LT5jYXJkaWQgPT0gMHgzMDYwMTIxYSkgewoJCQkvKiBGaXggdXAgZW50cnkgZm9yIDNERlggVm9vZG9vVFYgMTAwLAoJCQkgICB3aGljaCBpcyBhbiBPRU0gU1RCIGNhcmQgdmFyaWFudC4gKi8KCQkJYnR2LT5oYXNfcmFkaW89MDsKCQkJYnR2LT50dW5lcl90eXBlPVRVTkVSX1RFTUlDX05UU0M7CgkJfQoJCWJyZWFrOwoJY2FzZSBCVFRWX09TUFJFWTF4MDoKCWNhc2UgQlRUVl9PU1BSRVkxeDBfODQ4OgoJY2FzZSBCVFRWX09TUFJFWTEwMV84NDg6CgljYXNlIEJUVFZfT1NQUkVZMXgxOgoJY2FzZSBCVFRWX09TUFJFWTF4MV9TVklEOgoJY2FzZSBCVFRWX09TUFJFWTJ4eDoKCWNhc2UgQlRUVl9PU1BSRVkyeDBfU1ZJRDoKCWNhc2UgQlRUVl9PU1BSRVkyeDA6CgljYXNlIEJUVFZfT1NQUkVZNTAwOgoJY2FzZSBCVFRWX09TUFJFWTU0MDoKCWNhc2UgQlRUVl9PU1BSRVkyMDAwOgoJCWJ0dHZfcmVhZGVlKGJ0dixlZXByb21fZGF0YSwweGEwKTsKICAgICAgICAgICAgICAgIG9zcHJleV9lZXByb20oYnR2KTsKCQlicmVhazsKCWNhc2UgQlRUVl9JRFNfRUFHTEU6CgkJaW5pdF9pZHNfZWFnbGUoYnR2KTsKCQlicmVhazsKCWNhc2UgQlRUVl9NT0RURUNfMjA1OgoJCWJ0dHZfcmVhZGVlKGJ0dixlZXByb21fZGF0YSwweGEwKTsKCQltb2R0ZWNfZWVwcm9tKGJ0dik7CgkJYnJlYWs7CgljYXNlIEJUVFZfTE1MQlQ0OgoJCWluaXRfbG1sYnQ0eChidHYpOwoJCWJyZWFrOwoJY2FzZSBCVFRWX1RJQkVUX0NTMTY6CgkJdGliZXRDUzE2X2luaXQoYnR2KTsKCQlicmVhazsKCWNhc2UgQlRUVl9LT0RJQ09NXzQ0MDBSOgoJCWtvZGljb200NDAwcl9pbml0KGJ0dik7CgkJYnJlYWs7Cgl9CgoJLyogcGxsIGNvbmZpZ3VyYXRpb24gKi8KICAgICAgICBpZiAoIShidHYtPmlkPT04NDggJiYgYnR2LT5yZXZpc2lvbj09MHgxMSkpIHsKCQkvKiBkZWZhdWx0cyBmcm9tIGNhcmQgbGlzdCAqLwoJCWlmIChQTExfMjggPT0gYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5wbGwpIHsKCQkJYnR2LT5wbGwucGxsX2lmcmVxPTI4NjM2MzYzOwoJCQlidHYtPnBsbC5wbGxfY3J5c3RhbD1CVDg0OF9JRk9STV9YVDA7CgkJfQoJCWlmIChQTExfMzUgPT0gYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5wbGwpIHsKCQkJYnR2LT5wbGwucGxsX2lmcmVxPTM1NDY4OTUwOwoJCQlidHYtPnBsbC5wbGxfY3J5c3RhbD1CVDg0OF9JRk9STV9YVDE7CgkJfQoJCS8qIGluc21vZCBvcHRpb25zIGNhbiBvdmVycmlkZSAqLwogICAgICAgICAgICAgICAgc3dpdGNoIChwbGxbYnR2LT5jLm5yXSkgewogICAgICAgICAgICAgICAgY2FzZSAwOiAvKiBub25lICovCgkJCWJ0di0+cGxsLnBsbF9jcnlzdGFsID0gMDsKCQkJYnR2LT5wbGwucGxsX2lmcmVxICAgPSAwOwoJCQlidHYtPnBsbC5wbGxfb2ZyZXEgICA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAxOiAvKiAyOCBNSHogKi8KCQljYXNlIDI4OgogICAgICAgICAgICAgICAgICAgICAgICBidHYtPnBsbC5wbGxfaWZyZXEgICA9IDI4NjM2MzYzOwoJCQlidHYtPnBsbC5wbGxfb2ZyZXEgICA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGJ0di0+cGxsLnBsbF9jcnlzdGFsID0gQlQ4NDhfSUZPUk1fWFQwOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgMjogLyogMzUgTUh6ICovCgkJY2FzZSAzNToKICAgICAgICAgICAgICAgICAgICAgICAgYnR2LT5wbGwucGxsX2lmcmVxICAgPSAzNTQ2ODk1MDsKCQkJYnR2LT5wbGwucGxsX29mcmVxICAgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICBidHYtPnBsbC5wbGxfY3J5c3RhbCA9IEJUODQ4X0lGT1JNX1hUMTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgfQoJYnR2LT5wbGwucGxsX2N1cnJlbnQgPSAtMTsKCgkvKiB0dW5lciBjb25maWd1cmF0aW9uIChmcm9tIGNhcmQgbGlzdCAvIGF1dG9kZXRlY3QgLyBpbnNtb2Qgb3B0aW9uKSAqLwogCWlmIChVTlNFVCAhPSBidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLnR1bmVyX3R5cGUpCgkJaWYoVU5TRVQgPT0gYnR2LT50dW5lcl90eXBlKQogICAgICAgICAgICAgICAgCWJ0di0+dHVuZXJfdHlwZSA9IGJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0udHVuZXJfdHlwZTsKCWlmIChVTlNFVCAhPSB0dW5lcltidHYtPmMubnJdKQoJCWJ0di0+dHVuZXJfdHlwZSA9IHR1bmVyW2J0di0+Yy5ucl07CglwcmludGsoImJ0dHYlZDogdXNpbmcgdHVuZXI9JWRcbiIsYnR2LT5jLm5yLGJ0di0+dHVuZXJfdHlwZSk7CglpZiAoYnR2LT5waW5uYWNsZV9pZCAhPSBVTlNFVCkKCQlidHR2X2NhbGxfaTJjX2NsaWVudHMoYnR2LEFVRENfQ09ORklHX1BJTk5BQ0xFLAoJCQkJICAgICAgJmJ0di0+cGlubmFjbGVfaWQpOwoJaWYgKGJ0di0+dHVuZXJfdHlwZSAhPSBVTlNFVCkKCQlidHR2X2NhbGxfaTJjX2NsaWVudHMoYnR2LFRVTkVSX1NFVF9UWVBFLCZidHYtPnR1bmVyX3R5cGUpOwoJYnR2LT5zdmhzID0gYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5zdmhzOwoJaWYgKHN2aHNbYnR2LT5jLm5yXSAhPSBVTlNFVCkKCQlidHYtPnN2aHMgPSBzdmhzW2J0di0+Yy5ucl07CglpZiAocmVtb3RlW2J0di0+Yy5ucl0gIT0gVU5TRVQpCgkJYnR2LT5oYXNfcmVtb3RlID0gcmVtb3RlW2J0di0+Yy5ucl07CgoJaWYgKGJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0uaGFzX3JhZGlvKQoJCWJ0di0+aGFzX3JhZGlvPTE7CglpZiAoYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5oYXNfcmVtb3RlKQoJCWJ0di0+aGFzX3JlbW90ZT0xOwoJaWYgKGJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0ubm9fZ3Bpb2lycSkKCQlidHYtPmdwaW9pcnE9MDsKCWlmIChidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLmF1ZGlvX2hvb2spCgkJYnR2LT5hdWRpb19ob29rPWJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0uYXVkaW9faG9vazsKCglpZiAoYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5kaWdpdGFsX21vZGUgPT0gRElHSVRBTF9NT0RFX0NBTUVSQSkgewoJCS8qIGRldGVjdCBCdDgzMiBjaGlwIGZvciBxdWFydHpzaWdodCBkaWdpdGFsIGNhbWVyYSAqLwoJCWlmICgoYnR0dl9JMkNSZWFkKGJ0diwgSTJDX0JUODMyX0FMVDEsICJCdDgzMiIpID49MCkgfHwKCQkgICAgKGJ0dHZfSTJDUmVhZChidHYsIEkyQ19CVDgzMl9BTFQyLCAiQnQ4MzIiKSA+PTApKQoJCQlib290X2J0ODMyKGJ0dik7Cgl9CgoJaWYgKCFhdXRvbG9hZCkKCQlyZXR1cm47CgoJLyogdHJ5IHRvIGRldGVjdCBhdWRpby9mYWRlciBjaGlwcyAqLwoJaWYgKCFidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLm5vX21zcDM0eHggJiYKCSAgICBidHR2X0kyQ1JlYWQoYnR2LCBJMkNfTVNQMzQwMCwgIk1TUDM0eHgiKSA+PTApCgkJcmVxdWVzdF9tb2R1bGUoIm1zcDM0MDAiKTsKCglpZiAoYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5tc3AzNHh4X2FsdCAmJgoJICAgIGJ0dHZfSTJDUmVhZChidHYsIEkyQ19NU1AzNDAwX0FMVCwgIk1TUDM0eHggKGFsdGVybmF0ZSBhZGRyZXNzKSIpID49MCkKCQlyZXF1ZXN0X21vZHVsZSgibXNwMzQwMCIpOwoKCWlmICghYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5ub190ZGE5ODc1ICYmCgkgICAgYnR0dl9JMkNSZWFkKGJ0diwgSTJDX1REQTk4NzUsICJUREE5ODc1IikgPj0wKQoJCXJlcXVlc3RfbW9kdWxlKCJ0ZGE5ODc1Iik7CgoJaWYgKCFidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLm5vX3RkYTc0MzIgJiYKCSAgICBidHR2X0kyQ1JlYWQoYnR2LCBJMkNfVERBNzQzMiwgIlREQTc0MzIiKSA+PTApCgkJcmVxdWVzdF9tb2R1bGUoInRkYTc0MzIiKTsKCglpZiAoYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5uZWVkc190dmF1ZGlvKQoJCXJlcXVlc3RfbW9kdWxlKCJ0dmF1ZGlvIik7CgoJLyogdHVuZXIgbW9kdWxlcyAqLwoJdGRhOTg4NyA9IDA7CglpZiAoYnR2LT5waW5uYWNsZV9pZCAhPSBVTlNFVCkKCQl0ZGE5ODg3ID0gMTsKCWlmICgwID09IHRkYTk4ODcgJiYgMCA9PSBidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLmhhc19kdmIgJiYKCSAgICBidHR2X0kyQ1JlYWQoYnR2LCBJMkNfVERBOTg4NywgIlREQTk4ODciKSA+PTApCgkJdGRhOTg4NyA9IDE7CglpZigoYnR2LT50dW5lcl90eXBlID09IFRVTkVSX1BISUxJUFNfRk0xMjE2TUVfTUszKSB8fAoJICAgKGJ0di0+dHVuZXJfdHlwZSA9PSBUVU5FUl9QSElMSVBTX0ZNMTIzNl9NSzMpIHx8CgkgICAoYnR2LT50dW5lcl90eXBlID09IFRVTkVSX1BISUxJUFNfRk0xMjU2X0lIMykgfHwKCSAgICB0ZGE5ODg3KQoJCXJlcXVlc3RfbW9kdWxlKCJ0ZGE5ODg3Iik7CglpZiAoYnR2LT50dW5lcl90eXBlICE9IFVOU0VUKQoJCXJlcXVlc3RfbW9kdWxlKCJ0dW5lciIpOwp9CgoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCnN0YXRpYyB2b2lkIG1vZHRlY19lZXByb20oc3RydWN0IGJ0dHYgKmJ0dikKewoJaWYoIHN0cm5jbXAoJihlZXByb21fZGF0YVsweDFlXSksIlRlbWljIDQwNjYgRlk1IiwxNCkgPT0wKSB7CgkJYnR2LT50dW5lcl90eXBlPVRVTkVSX1RFTUlDXzQwNjZGWTVfUEFMX0k7CgkJcHJpbnRrKCJidHR2JWQ6IE1vZHRlYzogVHVuZXIgYXV0b2RldGVjdGVkIGJ5IGVlcHJvbTogJXNcbiIsCgkJICAgICAgIGJ0di0+Yy5uciwmZWVwcm9tX2RhdGFbMHgxZV0pOwoJfSBlbHNlIGlmIChzdHJuY21wKCYoZWVwcm9tX2RhdGFbMHgxZV0pLCJBbHBzIFRTQkI1IiwxMCkgPT0wKSB7CgkJYnR2LT50dW5lcl90eXBlPVRVTkVSX0FMUFNfVFNCQjVfUEFMX0k7CgkJcHJpbnRrKCJidHR2JWQ6IE1vZHRlYzogVHVuZXIgYXV0b2RldGVjdGVkIGJ5IGVlcHJvbTogJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgYnR2LT5jLm5yLCZlZXByb21fZGF0YVsweDFlXSk7CiAgICAgICAgfSBlbHNlIGlmIChzdHJuY21wKCYoZWVwcm9tX2RhdGFbMHgxZV0pLCJQaGlsaXBzIEZNMTI0NiIsMTQpID09MCkgewogICAgICAgICAgICAgICAgYnR2LT50dW5lcl90eXBlPVRVTkVSX1BISUxJUFNfTlRTQzsKICAgICAgICAgICAgICAgIHByaW50aygiYnR0diVkOiBNb2R0ZWM6IFR1bmVyIGF1dG9kZXRlY3RlZCBieSBlZXByb206ICVzXG4iLAogICAgICAgICAgICAgICAgICAgICAgIGJ0di0+Yy5uciwmZWVwcm9tX2RhdGFbMHgxZV0pOwoJfSBlbHNlIHsKCQlwcmludGsoImJ0dHYlZDogTW9kdGVjOiBVbmtub3duIFR1bmVyU3RyaW5nOiAlc1xuIiwKCQkgICAgICAgYnR2LT5jLm5yLCZlZXByb21fZGF0YVsweDFlXSk7Cgl9Cn0KCnN0YXRpYyB2b2lkIF9fZGV2aW5pdCBoYXVwcGF1Z2VfZWVwcm9tKHN0cnVjdCBidHR2ICpidHYpCnsKCXN0cnVjdCB0dmVlcHJvbSB0djsKCgl0dmVlcHJvbV9oYXVwcGF1Z2VfYW5hbG9nKCZ0diwgZWVwcm9tX2RhdGEpOwoJYnR2LT50dW5lcl90eXBlID0gdHYudHVuZXJfdHlwZTsKCWJ0di0+aGFzX3JhZGlvICA9IHR2Lmhhc19yYWRpbzsKfQoKc3RhdGljIGludCB0ZXJyYXRlY19hY3RpdmVfcmFkaW9fdXBncmFkZShzdHJ1Y3QgYnR0diAqYnR2KQp7CglpbnQgZnJlcTsKCglidHYtPmhhc19yYWRpbyAgICA9IDE7CglidHYtPmhhc19tYXRjaGJveCA9IDE7CglidHYtPm1ib3hfd2UgICAgICA9IDB4MTA7CglidHYtPm1ib3hfbW9zdCAgICA9IDB4MjA7CglidHYtPm1ib3hfY2xrICAgICA9IDB4MDg7CglidHYtPm1ib3hfZGF0YSAgICA9IDB4MDQ7CglidHYtPm1ib3hfbWFzayAgICA9IDB4M2M7CgoJYnR2LT5tYm94X2lvdyAgICAgPSAxIDw8ICA4OwoJYnR2LT5tYm94X2lvciAgICAgPSAxIDw8ICA5OwoJYnR2LT5tYm94X2NzZWwgICAgPSAxIDw8IDEwOwoKCWZyZXE9ODgwMDAvNjIuNTsKCXRlYTU3NTdfd3JpdGUoYnR2LCA1ICogZnJlcSArIDB4MzU4KTsgLy8gd3JpdGUgMHgxZWQ4CglpZiAoMHgxZWQ4ID09IHRlYTU3NTdfcmVhZChidHYpKSB7CgkJcHJpbnRrKCJidHR2JWQ6IFRlcnJhdGVjIEFjdGl2ZSBSYWRpbyBVcGdyYWRlIGZvdW5kLlxuIiwKCQkgICAgICAgYnR2LT5jLm5yKTsKCQlidHYtPmhhc19yYWRpbyAgICA9IDE7CgkJYnR2LT5oYXNfbWF0Y2hib3ggPSAxOwoJfSBlbHNlIHsKCQlidHYtPmhhc19yYWRpbyAgICA9IDA7CgkJYnR2LT5oYXNfbWF0Y2hib3ggPSAwOwoJfQoJcmV0dXJuIDA7Cn0KCgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKLyoKICogbWluaW1hbCBib290c3RyYXAgZm9yIHRoZSBXaW5UVi9QVlIgLS0gdXBsb2FkIGFsdGVyYSBmaXJtd2FyZS4KICoKICogVGhlIGhjd2FtYy5yYmYgZmlybXdhcmUgZmlsZSBpcyBvbiB0aGUgSGF1cHBhdWdlIGRyaXZlciBDRC4gIEhhdmUKICogYSBsb29rIGF0IFB2ci9wdnI0NXh4eC5FWEUgKHNlbGYtZXh0cmFjdGluZyB6aXAgYXJjaGl2ZSwgY2FuIGJlCiAqIHVucGFja2VkIHdpdGggdW56aXApLgogKi8KI2RlZmluZSBQVlJfR1BJT19ERUxBWQkJMTAKCiNkZWZpbmUgQlRUVl9BTFRfREFUQQkJMHgwMDAwMDEKI2RlZmluZSBCVFRWX0FMVF9EQ0xLCQkweDEwMDAwMAojZGVmaW5lIEJUVFZfQUxUX05DT05GSUcJMHg4MDAwMDAKCnN0YXRpYyBpbnQgX19kZXZpbml0IHB2cl9hbHRlcmFfbG9hZChzdHJ1Y3QgYnR0diAqYnR2LCB1OCAqbWljcm8sIHUzMiBtaWNyb2xlbikKewoJdTMyIG47CiAgCXU4IGJpdHM7CglpbnQgaTsKCglncGlvX2lub3V0KDB4ZmZmZmZmLEJUVFZfQUxUX0RBVEF8QlRUVl9BTFRfRENMS3xCVFRWX0FMVF9OQ09ORklHKTsKCWdwaW9fd3JpdGUoMCk7Cgl1ZGVsYXkoUFZSX0dQSU9fREVMQVkpOwoKCWdwaW9fd3JpdGUoQlRUVl9BTFRfTkNPTkZJRyk7Cgl1ZGVsYXkoUFZSX0dQSU9fREVMQVkpOwoKCWZvciAobiA9IDA7IG4gPCBtaWNyb2xlbjsgbisrKSB7CgkJYml0cyA9IG1pY3JvW25dOwoJCWZvciAoIGkgPSAwIDsgaSA8IDggOyBpKysgKSB7CgkJCWdwaW9fYml0cyhCVFRWX0FMVF9EQ0xLLDApOwoJCQlpZiAoYml0cyAmIDB4MDEpCgkJCQlncGlvX2JpdHMoQlRUVl9BTFRfREFUQSxCVFRWX0FMVF9EQVRBKTsKCQkJZWxzZQoJCQkJZ3Bpb19iaXRzKEJUVFZfQUxUX0RBVEEsMCk7CgkJCWdwaW9fYml0cyhCVFRWX0FMVF9EQ0xLLEJUVFZfQUxUX0RDTEspOwoJCQliaXRzID4+PSAxOwoJCX0KCX0KCWdwaW9fYml0cyhCVFRWX0FMVF9EQ0xLLDApOwoJdWRlbGF5KFBWUl9HUElPX0RFTEFZKTsKCgkvKiBiZWdpbiBBbHRlcmEgaW5pdCBsb29wIChOb3QgbmVjZXNzYXJ5LGJ1dCBkb2Vzbid0IGh1cnQpICovCglmb3IgKGkgPSAwIDsgaSA8IDMwIDsgaSsrKSB7CgkJZ3Bpb19iaXRzKEJUVFZfQUxUX0RDTEssMCk7CgkJZ3Bpb19iaXRzKEJUVFZfQUxUX0RDTEssQlRUVl9BTFRfRENMSyk7Cgl9CglncGlvX2JpdHMoQlRUVl9BTFRfRENMSywwKTsKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50IF9fZGV2aW5pdCBwdnJfYm9vdChzdHJ1Y3QgYnR0diAqYnR2KQp7CiAgICAgICAgY29uc3Qgc3RydWN0IGZpcm13YXJlICpmd19lbnRyeTsKCWludCByYzsKCglyYyA9IHJlcXVlc3RfZmlybXdhcmUoJmZ3X2VudHJ5LCAiaGN3YW1jLnJiZiIsICZidHYtPmMucGNpLT5kZXYpOwoJaWYgKHJjICE9IDApIHsKCQlwcmludGsoS0VSTl9XQVJOSU5HICJidHR2JWQ6IG5vIGFsdGVyYSBmaXJtd2FyZSBbdmlhIGhvdHBsdWddXG4iLAoJCSAgICAgICBidHYtPmMubnIpOwogICAgICAgICAgICAgICAgcmV0dXJuIHJjOwogICAgICAgIH0KCXJjID0gcHZyX2FsdGVyYV9sb2FkKGJ0diwgZndfZW50cnktPmRhdGEsIGZ3X2VudHJ5LT5zaXplKTsKCXByaW50ayhLRVJOX0lORk8gImJ0dHYlZDogYWx0ZXJhIGZpcm13YXJlIHVwbG9hZCAlc1xuIiwKCSAgICAgICBidHYtPmMubnIsIChyYyA8IDApID8gImZhaWxlZCIgOiAib2siKTsKICAgICAgICByZWxlYXNlX2Zpcm13YXJlKGZ3X2VudHJ5KTsKCXJldHVybiByYzsKfQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLyogc29tZSBvc3ByZXkgc3BlY2lmaWMgc3R1ZmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCnN0YXRpYyB2b2lkIF9fZGV2aW5pdCBvc3ByZXlfZWVwcm9tKHN0cnVjdCBidHR2ICpidHYpCnsKICAgICAgIGludCBpID0gMDsKICAgICAgIHVuc2lnbmVkIGNoYXIgKmVlID0gZWVwcm9tX2RhdGE7CiAgICAgICB1bnNpZ25lZCBsb25nIHNlcmlhbCA9IDA7CgogICAgICAgaWYgKGJ0di0+Yy50eXBlID09IDApIHsKICAgICAgICAgICAgICAgLyogdGhpcyBtaWdodCBiZSBhbiBhbnRpcXVlLi4uIGNoZWNrIGZvciBNTUFDIGxhYmVsIGluIGVlcHJvbSAqLwogICAgICAgICAgICAgICBpZiAoKGVlWzBdPT0nTScpICYmIChlZVsxXT09J00nKSAmJiAoZWVbMl09PSdBJykgJiYgKGVlWzNdPT0nQycpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBjaGVja3N1bSA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0wOyBpPDIxOyBpKyspCgkJCSAgICAgICBjaGVja3N1bSArPSBlZVtpXTsKICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hlY2tzdW0gIT0gZWVbMjFdKQoJCQkgICAgICAgcmV0dXJuOwoJCSAgICAgICBidHYtPmMudHlwZSA9IEJUVFZfT1NQUkVZMXgwXzg0ODsKCQkgICAgICAgZm9yIChpID0gMTI7IGkgPCAyMTsgaSsrKQoJCQkgICAgICAgc2VyaWFsICo9IDEwLCBzZXJpYWwgKz0gZWVbaV0gLSAnMCc7CiAgICAgICAgICAgICAgIH0KICAgICAgIH0gZWxzZSB7CgkgICAgICAgdW5zaWduZWQgc2hvcnQgdHlwZTsKICAgICAgICAgICAgICAgaW50IG9mZnNldCA9IDQqMTY7CgogICAgICAgICAgICAgICBmb3IoOyBvZmZzZXQgPCA4KjE2OyBvZmZzZXQgKz0gMTYpIHsKICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCBjaGVja3N1bSA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgLyogdmVyaWZ5IHRoZSBjaGVja3N1bSAqLwogICAgICAgICAgICAgICAgICAgICAgIGZvcihpID0gMDsgaTwxNDsgaSsrKSBjaGVja3N1bSArPSBlZVtpK29mZnNldF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja3N1bSA9IH5jaGVja3N1bTsgIC8qIG5vIGlkZWEgd2h5ICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKCgoY2hlY2tzdW0+PjgpJjB4MEZGKSA9PSBlZVtvZmZzZXQrMTRdKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoY2hlY2tzdW0gJiAweDBGRikgPT0gZWVbb2Zmc2V0KzE1XSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgaWYgKG9mZnNldCA+PSA4KjE2KQoJCSAgICAgICByZXR1cm47CgoJICAgICAgIC8qIGZvdW5kIGEgdmFsaWQgZGVzY3JpcHRvciAqLwoJICAgICAgIHR5cGUgPSAoZWVbb2Zmc2V0KzRdPDw4KSB8IChlZVtvZmZzZXQrNV0pOwoKCSAgICAgICBzd2l0Y2godHlwZSkgewoKCSAgICAgICAvKiA4NDggYmFzZWQgKi8KCSAgICAgICBjYXNlIDB4MDAwNDoKCQkgICAgICAgYnR2LT5jLnR5cGUgPSBCVFRWX09TUFJFWTF4MF84NDg7CgkJICAgICAgIGJyZWFrOwoJICAgICAgIGNhc2UgMHgwMDA1OgoJCSAgICAgICBidHYtPmMudHlwZSA9IEJUVFZfT1NQUkVZMTAxXzg0ODsKCQkgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAvKiA4NzggYmFzZWQgKi8KCSAgICAgICBjYXNlIDB4MDAxMjoKCSAgICAgICBjYXNlIDB4MDAxMzoKCQkgICAgICAgYnR2LT5jLnR5cGUgPSBCVFRWX09TUFJFWTF4MDsKCQkgICAgICAgYnJlYWs7CgkgICAgICAgY2FzZSAweDAwMTQ6CgkgICAgICAgY2FzZSAweDAwMTU6CgkJICAgICAgIGJ0di0+Yy50eXBlID0gQlRUVl9PU1BSRVkxeDE7CgkJICAgICAgIGJyZWFrOwoJICAgICAgIGNhc2UgMHgwMDE2OgoJICAgICAgIGNhc2UgMHgwMDE3OgoJICAgICAgIGNhc2UgMHgwMDIwOgoJCSAgICAgICBidHYtPmMudHlwZSA9IEJUVFZfT1NQUkVZMXgxX1NWSUQ7CgkJICAgICAgIGJyZWFrOwoJICAgICAgIGNhc2UgMHgwMDE4OgoJICAgICAgIGNhc2UgMHgwMDE5OgoJICAgICAgIGNhc2UgMHgwMDFFOgoJICAgICAgIGNhc2UgMHgwMDFGOgoJCSAgICAgICBidHYtPmMudHlwZSA9IEJUVFZfT1NQUkVZMnh4OwoJCSAgICAgICBicmVhazsKCSAgICAgICBjYXNlIDB4MDAxQToKCSAgICAgICBjYXNlIDB4MDAxQjoKCQkgICAgICAgYnR2LT5jLnR5cGUgPSBCVFRWX09TUFJFWTJ4MF9TVklEOwoJCSAgICAgICBicmVhazsKCSAgICAgICBjYXNlIDB4MDA0MDoKCQkgICAgICAgYnR2LT5jLnR5cGUgPSBCVFRWX09TUFJFWTUwMDsKCQkgICAgICAgYnJlYWs7CgkgICAgICAgY2FzZSAweDAwNTA6CgkgICAgICAgY2FzZSAweDAwNTY6CgkJICAgICAgIGJ0di0+Yy50eXBlID0gQlRUVl9PU1BSRVk1NDA7CgkJICAgICAgIC8qIGJ0dHZfb3NwcmV5XzU0MF9pbml0KGJ0dik7ICovCgkJICAgICAgIGJyZWFrOwoJICAgICAgIGNhc2UgMHgwMDYwOgoJICAgICAgIGNhc2UgMHgwMDcwOgoJCSAgICAgICBidHYtPmMudHlwZSA9IEJUVFZfT1NQUkVZMngwOwoJCSAgICAgICAvL2VuYWJsZSBvdXRwdXQgb24gc2VsZWN0IGNvbnRyb2wgbGluZXMKCQkgICAgICAgZ3Bpb19pbm91dCgweGZmZmZmZiwweDAwMDMwMyk7CgkJICAgICAgIGJyZWFrOwoJICAgICAgIGRlZmF1bHQ6CgkJICAgICAgIC8qIHVua25vd24uLi5sZWF2ZSBnZW5lcmljLCBidXQgZ2V0IHNlcmlhbCAjICovCgkJICAgICAgIGJyZWFrOwoJICAgICAgIH0KCSAgICAgICBzZXJpYWwgPSAgKGVlW29mZnNldCs2XSA8PCAyNCkKCQkgICAgICAgfCAoZWVbb2Zmc2V0KzddIDw8IDE2KQoJCSAgICAgICB8IChlZVtvZmZzZXQrOF0gPDwgIDgpCgkJICAgICAgIHwgKGVlW29mZnNldCs5XSk7CiAgICAgICB9CgogICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiYnR0diVkOiBvc3ByZXkgZWVwcm9tOiBjYXJkPSVkIG5hbWU9JXMgc2VyaWFsPSVsZFxuIiwKCSAgICAgIGJ0di0+Yy5uciwgYnR2LT5jLnR5cGUsIGJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0ubmFtZSxzZXJpYWwpOwp9CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwovKiBBVmVybWVkaWEgc3BlY2lmaWMgc3R1ZmYsIGZyb20gIGJrdHJfY2FyZC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKc3RhdGljIGludCB0dW5lcl8wX3RhYmxlW10gPSB7CiAgICAgICAgVFVORVJfUEhJTElQU19OVFNDLCAgVFVORVJfUEhJTElQU19QQUwgLyogUEFMLUJHKi8sCiAgICAgICAgVFVORVJfUEhJTElQU19QQUwsICAgVFVORVJfUEhJTElQU19QQUwgLyogUEFMLUkqLywKICAgICAgICBUVU5FUl9QSElMSVBTX1BBTCwgICBUVU5FUl9QSElMSVBTX1BBTCwKICAgICAgICBUVU5FUl9QSElMSVBTX1NFQ0FNLCBUVU5FUl9QSElMSVBTX1NFQ0FNLAogICAgICAgIFRVTkVSX1BISUxJUFNfU0VDQU0sIFRVTkVSX1BISUxJUFNfUEFMLAoJVFVORVJfUEhJTElQU19GTTEyMTZNRV9NSzMgfTsKI2lmIDAKaW50IHR1bmVyXzBfZm1fdGFibGVbXSA9IHsKICAgICAgICBQSElMSVBTX0ZSMTIzNl9OVFNDLCAgUEhJTElQU19GUjEyMTZfUEFMLAogICAgICAgIFBISUxJUFNfRlIxMjE2X1BBTCwgICBQSElMSVBTX0ZSMTIxNl9QQUwsCiAgICAgICAgUEhJTElQU19GUjEyMTZfUEFMLCAgIFBISUxJUFNfRlIxMjE2X1BBTCwKICAgICAgICBQSElMSVBTX0ZSMTIzNl9TRUNBTSwgUEhJTElQU19GUjEyMzZfU0VDQU0sCiAgICAgICAgUEhJTElQU19GUjEyMzZfU0VDQU0sIFBISUxJUFNfRlIxMjE2X1BBTH07CiNlbmRpZgoKc3RhdGljIGludCB0dW5lcl8xX3RhYmxlW10gPSB7CiAgICAgICAgVFVORVJfVEVNSUNfTlRTQywgIFRVTkVSX1RFTUlDX1BBTCwKCVRVTkVSX1RFTUlDX1BBTCwgICBUVU5FUl9URU1JQ19QQUwsCglUVU5FUl9URU1JQ19QQUwsICAgVFVORVJfVEVNSUNfUEFMLAogICAgICAgIFRVTkVSX1RFTUlDXzQwMTJGWTUsIFRVTkVSX1RFTUlDXzQwMTJGWTUsIC8vVFVORVJfVEVNSUNfU0VDQU0KICAgICAgICBUVU5FUl9URU1JQ180MDEyRlk1LCBUVU5FUl9URU1JQ19QQUx9OwoKc3RhdGljIHZvaWQgX19kZXZpbml0IGF2ZXJtZWRpYV9lZXByb20oc3RydWN0IGJ0dHYgKmJ0dikKewogICAgICAgIGludCB0dW5lcl9tYWtlLHR1bmVyX3R2X2ZtLHR1bmVyX2Zvcm1hdCx0dW5lcj0wOwoKCXR1bmVyX21ha2UgICAgICA9IChlZXByb21fZGF0YVsweDQxXSAmIDB4Nyk7CiAgICAgICAgdHVuZXJfdHZfZm0gICAgID0gKGVlcHJvbV9kYXRhWzB4NDFdICYgMHgxOCkgPj4gMzsKICAgICAgICB0dW5lcl9mb3JtYXQgICAgPSAoZWVwcm9tX2RhdGFbMHg0Ml0gJiAweGYwKSA+PiA0OwoJYnR2LT5oYXNfcmVtb3RlID0gKGVlcHJvbV9kYXRhWzB4NDJdICYgMHgwMSk7CgoJaWYgKHR1bmVyX21ha2UgPT0gMCB8fCB0dW5lcl9tYWtlID09IDIpCgkJaWYodHVuZXJfZm9ybWF0IDw9MHgwYSkKCQkJdHVuZXIgPSB0dW5lcl8wX3RhYmxlW3R1bmVyX2Zvcm1hdF07CglpZiAodHVuZXJfbWFrZSA9PSAxKQoJCWlmKHR1bmVyX2Zvcm1hdCA8PTkpCgkJCXR1bmVyID0gdHVuZXJfMV90YWJsZVt0dW5lcl9mb3JtYXRdOwoKCWlmICh0dW5lcl9tYWtlID09IDQpCgkJaWYodHVuZXJfZm9ybWF0ID09IDB4MDkpCgkJCXR1bmVyID0gVFVORVJfTEdfTlRTQ19ORVdfVEFQQzsgLy8gVEFQQy1HNzAyUAoKCXByaW50ayhLRVJOX0lORk8gImJ0dHYlZDogQXZlcm1lZGlhIGVlcHJvbVsweCUwMnglMDJ4XTogdHVuZXI9IiwKCQlidHYtPmMubnIsZWVwcm9tX2RhdGFbMHg0MV0sZWVwcm9tX2RhdGFbMHg0Ml0pOwoJaWYodHVuZXIpIHsKCQlidHYtPnR1bmVyX3R5cGU9dHVuZXI7CgkJcHJpbnRrKCIlZCIsdHVuZXIpOwoJfSBlbHNlCgkJcHJpbnRrKCJVbmtub3duIHR5cGUiKTsKCXByaW50aygiIHJhZGlvOiVzIHJlbW90ZSBjb250cm9sOiVzXG4iLAoJICAgICAgIHR1bmVyX3R2X2ZtICAgICA/ICJ5ZXMiIDogIm5vIiwKCSAgICAgICBidHYtPmhhc19yZW1vdGUgPyAieWVzIiA6ICJubyIpOwp9CgovKiB1c2VkIG9uIFZvb2RvbyBUVi9GTSAoVm9vZG9vIDIwMCksIFMwIHdpcmVkIHRvIDB4MTAwMDAgKi8Kdm9pZCBidHR2X3RkYTk4ODBfc2V0bm9ybShzdHJ1Y3QgYnR0diAqYnR2LCBpbnQgbm9ybSkKewoJLy8gZml4IHVwIG91ciBjYXJkIGVudHJ5CglpZihub3JtPT1WSURFT19NT0RFX05UU0MpIHsKCQlidHR2X3R2Y2FyZHNbQlRUVl9WT09ET09UVl9GTV0uYXVkaW9tdXhbMF09MHg5NTdmZmY7CgkJYnR0dl90dmNhcmRzW0JUVFZfVk9PRE9PVFZfRk1dLmF1ZGlvbXV4WzRdPTB4OTU3ZmZmOwoJCWRwcmludGsoImJ0dHZfdGRhOTg4MF9zZXRub3JtIHRvIE5UU0NcbiIpOwoJfQoJZWxzZSB7CgkgICAgICAgIGJ0dHZfdHZjYXJkc1tCVFRWX1ZPT0RPT1RWX0ZNXS5hdWRpb211eFswXT0weDk0N2ZmZjsKICAgICAgICAgICAgICAgIGJ0dHZfdHZjYXJkc1tCVFRWX1ZPT0RPT1RWX0ZNXS5hdWRpb211eFs0XT0weDk0N2ZmZjsKCQlkcHJpbnRrKCJidHR2X3RkYTk4ODBfc2V0bm9ybSB0byBQQUxcbiIpOwoJfQoJLy8gc2V0IEdQSU8gYWNjb3JkaW5nCglncGlvX2JpdHMoYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5ncGlvbWFzaywKCQkgIGJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0uYXVkaW9tdXhbYnR2LT5hdWRpb10pOwp9CgoKLyoKICogcmVzZXQvZW5hYmxlIHRoZSBNU1Agb24gc29tZSBIYXVwcGF1Z2UgY2FyZHMKICogVGhhbmtzIHRvIEt59nN0aSBN5Gxra2kgKGttYWxra2lAY2MuaHV0LmZpKSEKICoKICogSGF1cHBhdWdlOiAgcGluICA1CiAqIFZvb2RvbzogICAgIHBpbiAyMAogKi8Kc3RhdGljIHZvaWQgX19kZXZpbml0IGJvb3RfbXNwMzR4eChzdHJ1Y3QgYnR0diAqYnR2LCBpbnQgcGluKQp7CglpbnQgbWFzayA9ICgxIDw8IHBpbik7CgoJZ3Bpb19pbm91dChtYXNrLG1hc2spOwoJZ3Bpb19iaXRzKG1hc2ssMCk7CiAgICAgICAgdWRlbGF5KDI1MDApOwoJZ3Bpb19iaXRzKG1hc2ssbWFzayk7CgoJaWYgKGJ0dHZfZ3BpbykKCQlidHR2X2dwaW9fdHJhY2tpbmcoYnR2LCJtc3AzNHh4Iik7CglpZiAoYnR0dl92ZXJib3NlKQoJCXByaW50ayhLRVJOX0lORk8gImJ0dHYlZDogSGF1cHBhdWdlL1Zvb2RvbyBtc3AzNHh4OiByZXNldCBsaW5lICIKCQkgICAgICAgImluaXQgWyVkXVxuIiwgYnR2LT5jLm5yLCBwaW4pOwp9CgpzdGF0aWMgdm9pZCBfX2RldmluaXQgYm9vdF9idDgzMihzdHJ1Y3QgYnR0diAqYnR2KQp7CiNpZiAwIC8qIG5vdCB3b3JraW5nIHlldCAqLwoJaW50IHJlc2V0Yml0PTA7CgoJc3dpdGNoIChidHYtPmMudHlwZSkgewoJY2FzZSBCVFRWX1BYRUxWV1BMVFZQQUs6CgkJcmVzZXRiaXQgPSAweDQwMDAwMDsKCQlicmVhazsKCWNhc2UgQlRUVl9NT0RURUNfMjA1OgoJCXJlc2V0Yml0ID0gMTw8OTsKCQlicmVhazsKCWRlZmF1bHQ6CgkJQlVHKCk7Cgl9CgoJcmVxdWVzdF9tb2R1bGUoImJ0ODMyIik7CglidHR2X2NhbGxfaTJjX2NsaWVudHMoYnR2LCBCVDgzMl9IRVhEVU1QLCBOVUxMKTsKCglwcmludGsoImJ0dHYlZDogUmVzZXQgQnQ4MzIgW2xpbmU9MHgleF1cbiIsYnR2LT5jLm5yLHJlc2V0Yml0KTsKCWdwaW9fd3JpdGUoMCk7CglncGlvX2lub3V0KHJlc2V0Yml0LCByZXNldGJpdCk7Cgl1ZGVsYXkoNSk7CglncGlvX2JpdHMocmVzZXRiaXQsIHJlc2V0Yml0KTsKCXVkZWxheSg1KTsKCWdwaW9fYml0cyhyZXNldGJpdCwgMCk7Cgl1ZGVsYXkoNSk7CgoJLy8gYnQ4MzIgb24gcGl4ZWx2aWV3IGNoYW5nZXMgZnJvbSBpMmMgMHg4YSB0byAweDg4IGFmdGVyCgkvLyBiZWluZyByZXNldCBhcyBhYm92ZS4gU28gd2UgbXVzdCBmb2xsb3cgYnkgdGhpczoKCWJ0dHZfY2FsbF9pMmNfY2xpZW50cyhidHYsIEJUODMyX1JFQVRUQUNILCBOVUxMKTsKI2VuZGlmCn0KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi8qICBJbWFnZW5hdGlvbiBMLU1vZGVsIFBYQzIwMCBGcmFtZWdyYWJiZXIgKi8KLyogIFRoaXMgaXMgYmFzaWNhbGx5IHRoZSBzYW1lIHByb2NlZHVyZSBhcwogKiAgdXNlZCBieSBBbGVzc2FuZHJvIFJ1YmluaSBpbiBoaXMgcHhjMjAwCiAqICBkcml2ZXIsIGJ1dCB1c2luZyBCVFRWIGZ1bmN0aW9ucyAqLwoKc3RhdGljIHZvaWQgX19kZXZpbml0IGluaXRfUFhDMjAwKHN0cnVjdCBidHR2ICpidHYpCnsKCXN0YXRpYyBpbnQgdmFsc1tdIF9fZGV2aW5pdGRhdGEgPSB7IDB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGQsIDB4MGQsCgkJCQkJICAgIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsCgkJCQkJICAgIDB4MDAgfTsKCXVuc2lnbmVkIGludCBpOwoJaW50IHRtcDsKCXUzMiB2YWw7CgoJLyogSW5pdGlhbGlzZSBHUElPLWNvbm5ldnRlZCBzdHVmZiAqLwoJZ3Bpb19pbm91dCgweGZmZmZmZiwgKDE8PDEzKSk7CglncGlvX3dyaXRlKDApOwoJdWRlbGF5KDMpOwoJZ3Bpb193cml0ZSgxPDwxMyk7CgkvKiBHUElPIGlucHV0cyBhcmUgcHVsbGVkIHVwLCBzbyBubyBuZWVkIHRvIGRyaXZlCgkgKiByZXNldCBwaW4gYW55IGxvbmdlciAqLwoJZ3Bpb19iaXRzKDB4ZmZmZmZmLCAwKTsKCWlmIChidHR2X2dwaW8pCgkJYnR0dl9ncGlvX3RyYWNraW5nKGJ0diwicHhjMjAwIik7CgoJLyogIHdlIGNvdWxkL3Nob3VsZCB0cnkgYW5kIHJlc2V0L2NvbnRyb2wgdGhlIEFEIHBvdHM/IGJ1dAoJICAgIHJpZ2h0IG5vdyAgd2Ugc2ltcGx5ICB0dXJuZWQgb2ZmIHRoZSBjcnVzaGluZy4gIFdpdGhvdXQKCSAgICB0aGlzIHRoZSBBR0MgZHJpZnRzIGRyaWZ0cwoJICAgIHJlbWVtYmVyIHRoZSBFTiBpcyByZXZlcnNlIGxvZ2ljIC0tPgoJICAgIHNldHRpbmcgQlQ4NDhfQURDX0FHQ19FTiBkaXNhYmxlIHRoZSBBR0MKCSAgICB0Ym91bHRAZWVjcy5sZWhpZ2guZWR1CgkqLwoKCWJ0d3JpdGUoQlQ4NDhfQURDX1JFU0VSVkVEfEJUODQ4X0FEQ19BR0NfRU4sIEJUODQ4X0FEQyk7CgoJLyoJSW5pdGlhbGlzZSBNQVg1MTcgREFDICovCglwcmludGsoS0VSTl9JTkZPICJTZXR0aW5nIERBQyByZWZlcmVuY2Ugdm9sdGFnZSBsZXZlbCAuLi5cbiIpOwoJYnR0dl9JMkNXcml0ZShidHYsMHg1RSwwLDB4ODAsMSk7CgoJLyoJSW5pdGlhbGlzZSAxMkM1MDggUElDICovCgkvKglUaGUgSTJDV3JpdGUgYW5kIEkyQ1JlYWQgY29tbW1hbmRzIGFyZSBhY3R1YWxseSB0byB0aGUKCSAqCXNhbWUgY2hpcHMgLSBidXQgdGhlIFIvVyBiaXQgaXMgaW5jbHVkZWQgaW4gdGhlIGFkZHJlc3MKCSAqCWFyZ3VtZW50IHNvIHRoZSBudW1iZXJzIGFyZSBkaWZmZXJlbnQgKi8KCgoJcHJpbnRrKEtFUk5fSU5GTyAiSW5pdGlhbGlzaW5nIDEyQzUwOCBQSUMgY2hpcCAuLi5cbiIpOwoKCS8qIEZpcnN0IG9mIGFsbCwgZW5hYmxlIHRoZSBjbG9jayBsaW5lLiBUaGlzIGlzIHVzZWQgaW4gdGhlIFBYQzIwMC1GICovCgl2YWwgPSBidHJlYWQoQlQ4NDhfR1BJT19ETUFfQ1RMKTsKCXZhbCB8PSBCVDg0OF9HUElPX0RNQV9DVExfR1BDTEtNT0RFOwoJYnR3cml0ZSh2YWwsIEJUODQ4X0dQSU9fRE1BX0NUTCk7CgoJLyogVGhlbiwgcHVzaCB0byAwIHRoZSByZXNldCBwaW4gbG9uZyBlbm91Z2ggdG8gcmVzZXQgdGhlICoKCSAqIGRldmljZSBzYW1lIGFzIGFib3ZlIGZvciB0aGUgcmVzZXQgbGluZSwgYnV0IG5vdCB0aGUgc2FtZQoJICogdmFsdWUgc2VudCB0byB0aGUgR1BJTy1jb25uZWN0ZWQgc3R1ZmYKCSAqIHdoaWNoIG9uZSBpcyB0aGUgZ29vZCBvbmU/ICovCglncGlvX2lub3V0KDB4ZmZmZmZmLCgxPDwyKSk7CglncGlvX3dyaXRlKDApOwoJdWRlbGF5KDEwKTsKCWdwaW9fd3JpdGUoMTw8Mik7CgogICAgICAgCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHZhbHMpOyBpKyspIHsKCQl0bXA9YnR0dl9JMkNXcml0ZShidHYsMHgxRSwwLHZhbHNbaV0sMSk7CgkJaWYgKHRtcCAhPSAtMSkgewoJCQlwcmludGsoS0VSTl9JTkZPCgkJCSAgICAgICAiSTJDIFdyaXRlKCUyLjJ4KSA9ICVpXG5JMkMgUmVhZCAoKSA9ICUyLjJ4XG5cbiIsCgkJCSAgICAgICB2YWxzW2ldLHRtcCxidHR2X0kyQ1JlYWQoYnR2LDB4MUYsTlVMTCkpOwoJCX0KCX0KCglwcmludGsoS0VSTl9JTkZPICJQWEMyMDAgSW5pdGlhbGlzZWQuXG4iKTsKfQoKCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi8qIE1pcm8gUHJvIHJhZGlvIHN0dWZmIC0tIHRoZSB0ZWE1NzU3IGlzIGNvbm5lY3RlZCB0byBzb21lIEdQSU8gcG9ydHMgICAgICovCi8qCiAqIENvcHlyaWdodCAoYykgMTk5OSBDc2FiYSBIYWxhc3ogPHFnZWhhbGlAdW5pLW1pc2tvbGMuaHU+CiAqIFRoaXMgY29kZSBpcyBwbGFjZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKgogKiBCcnV0YWxseSBoYWNrZWQgYnkgRGFuIFNoZXJpZGFuIDxkYW4uc2hlcmlkYW5AY29udGFjdC5vcmcudWs+IGRqczUyIDgvMy8wMAogKi8KCnN0YXRpYyB2b2lkIGJ1c19sb3coc3RydWN0IGJ0dHYgKmJ0diwgaW50IGJpdCkKewoJaWYgKGJ0di0+bWJveF9pb3IpIHsKCQlncGlvX2JpdHMoYnR2LT5tYm94X2lvciB8IGJ0di0+bWJveF9pb3cgfCBidHYtPm1ib3hfY3NlbCwKCQkJICBidHYtPm1ib3hfaW9yIHwgYnR2LT5tYm94X2lvdyB8IGJ0di0+bWJveF9jc2VsKTsKCQl1ZGVsYXkoNSk7Cgl9CgoJZ3Bpb19iaXRzKGJpdCwwKTsKCXVkZWxheSg1KTsKCglpZiAoYnR2LT5tYm94X2lvcikgewoJCWdwaW9fYml0cyhidHYtPm1ib3hfaW93IHwgYnR2LT5tYm94X2NzZWwsIDApOwoJCXVkZWxheSg1KTsKCX0KfQoKc3RhdGljIHZvaWQgYnVzX2hpZ2goc3RydWN0IGJ0dHYgKmJ0diwgaW50IGJpdCkKewoJaWYgKGJ0di0+bWJveF9pb3IpIHsKCQlncGlvX2JpdHMoYnR2LT5tYm94X2lvciB8IGJ0di0+bWJveF9pb3cgfCBidHYtPm1ib3hfY3NlbCwKCQkJICBidHYtPm1ib3hfaW9yIHwgYnR2LT5tYm94X2lvdyB8IGJ0di0+bWJveF9jc2VsKTsKCQl1ZGVsYXkoNSk7Cgl9CgoJZ3Bpb19iaXRzKGJpdCxiaXQpOwoJdWRlbGF5KDUpOwoKCWlmIChidHYtPm1ib3hfaW9yKSB7CgkJZ3Bpb19iaXRzKGJ0di0+bWJveF9pb3cgfCBidHYtPm1ib3hfY3NlbCwgMCk7CgkJdWRlbGF5KDUpOwoJfQp9CgpzdGF0aWMgaW50IGJ1c19pbihzdHJ1Y3QgYnR0diAqYnR2LCBpbnQgYml0KQp7CglpZiAoYnR2LT5tYm94X2lvcikgewoJCWdwaW9fYml0cyhidHYtPm1ib3hfaW9yIHwgYnR2LT5tYm94X2lvdyB8IGJ0di0+bWJveF9jc2VsLAoJCQkgIGJ0di0+bWJveF9pb3IgfCBidHYtPm1ib3hfaW93IHwgYnR2LT5tYm94X2NzZWwpOwoJCXVkZWxheSg1KTsKCgkJZ3Bpb19iaXRzKGJ0di0+bWJveF9pb3cgfCBidHYtPm1ib3hfY3NlbCwgMCk7CgkJdWRlbGF5KDUpOwoJfQoJcmV0dXJuIGdwaW9fcmVhZCgpICYgKGJpdCk7Cn0KCi8qIFRFQTU3NTcgcmVnaXN0ZXIgYml0cyAqLwojZGVmaW5lIFRFQV9GUkVRCQkwOjE0CiNkZWZpbmUgVEVBX0JVRkZFUgkJMTU6MTUKCiNkZWZpbmUgVEVBX1NJR05BTF9TVFJFTkdUSAkxNjoxNwoKI2RlZmluZSBURUFfUE9SVDEJCTE4OjE4CiNkZWZpbmUgVEVBX1BPUlQwCQkxOToxOQoKI2RlZmluZSBURUFfQkFORAkJMjA6MjEKI2RlZmluZSBURUFfQkFORF9GTQkJMAojZGVmaW5lIFRFQV9CQU5EX01XCQkxCiNkZWZpbmUgVEVBX0JBTkRfTFcJCTIKI2RlZmluZSBURUFfQkFORF9TVwkJMwoKI2RlZmluZSBURUFfTU9OTwkJMjI6MjIKI2RlZmluZSBURUFfQUxMT1dfU1RFUkVPCTAKI2RlZmluZSBURUFfRk9SQ0VfTU9OTwkJMQoKI2RlZmluZSBURUFfU0VBUkNIX0RJUkVDVElPTgkyMzoyMwojZGVmaW5lIFRFQV9TRUFSQ0hfRE9XTgkJMAojZGVmaW5lIFRFQV9TRUFSQ0hfVVAJCTEKCiNkZWZpbmUgVEVBX1NUQVRVUwkJMjQ6MjQKI2RlZmluZSBURUFfU1RBVFVTX1RVTkVECTAKI2RlZmluZSBURUFfU1RBVFVTX1NFQVJDSElORwkxCgovKiBMb3ctbGV2ZWwgc3R1ZmYgKi8Kc3RhdGljIGludCB0ZWE1NzU3X3JlYWQoc3RydWN0IGJ0dHYgKmJ0dikKewoJdW5zaWduZWQgbG9uZyB0aW1lb3V0OwoJaW50IHZhbHVlID0gMDsKCWludCBpOwoKCS8qIGJldHRlciBzYWZlIHRoYW4gc29ycnkgKi8KCWdwaW9faW5vdXQoYnR2LT5tYm94X21hc2ssIGJ0di0+bWJveF9jbGsgfCBidHYtPm1ib3hfd2UpOwoKCWlmIChidHYtPm1ib3hfaW9yKSB7CgkJZ3Bpb19iaXRzKGJ0di0+bWJveF9pb3IgfCBidHYtPm1ib3hfaW93IHwgYnR2LT5tYm94X2NzZWwsCgkJCSAgYnR2LT5tYm94X2lvciB8IGJ0di0+bWJveF9pb3cgfCBidHYtPm1ib3hfY3NlbCk7CgkJdWRlbGF5KDUpOwoJfQoKCWlmIChidHR2X2dwaW8pCgkJYnR0dl9ncGlvX3RyYWNraW5nKGJ0diwidGVhNTc1NyByZWFkIik7CgoJYnVzX2xvdyhidHYsYnR2LT5tYm94X3dlKTsKCWJ1c19sb3coYnR2LGJ0di0+bWJveF9jbGspOwoKCXVkZWxheSgxMCk7Cgl0aW1lb3V0PSBqaWZmaWVzICsgSFo7CgoJLy8gd2FpdCBmb3IgREFUQSBsaW5lIHRvIGdvIGxvdzsgZXJyb3IgaWYgaXQgZG9lc24ndAoJd2hpbGUgKGJ1c19pbihidHYsYnR2LT5tYm94X2RhdGEpICYmIHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpKQoJCXNjaGVkdWxlKCk7CglpZiAoYnVzX2luKGJ0dixidHYtPm1ib3hfZGF0YSkpIHsKCQlwcmludGsoS0VSTl9XQVJOSU5HICJidHR2JWQ6IHRlYTU3NTc6IHJlYWQgdGltZW91dFxuIixidHYtPmMubnIpOwoJCXJldHVybiAtMTsKCX0KCglkcHJpbnRrKCJidHR2JWQ6IHRlYTU3NTc6IixidHYtPmMubnIpOwoJZm9yKGkgPSAwOyBpIDwgMjQ7IGkrKykKCXsKCQl1ZGVsYXkoNSk7CgkJYnVzX2hpZ2goYnR2LGJ0di0+bWJveF9jbGspOwoJCXVkZWxheSg1KTsKCQlkcHJpbnRrKCIlYyIsKGJ1c19pbihidHYsYnR2LT5tYm94X21vc3QpID09IDApPydUJzonLScpOwoJCWJ1c19sb3coYnR2LGJ0di0+bWJveF9jbGspOwoJCXZhbHVlIDw8PSAxOwoJCXZhbHVlIHw9IChidXNfaW4oYnR2LGJ0di0+bWJveF9kYXRhKSA9PSAwKT8wOjE7ICAvKiBNU0IgZmlyc3QgKi8KCQlkcHJpbnRrKCIlYyIsIChidXNfaW4oYnR2LGJ0di0+bWJveF9tb3N0KSA9PSAwKT8nUyc6J00nKTsKCX0KCWRwcmludGsoIlxuYnR0diVkOiB0ZWE1NzU3OiByZWFkIDB4JVhcbiIsIGJ0di0+Yy5uciwgdmFsdWUpOwoJcmV0dXJuIHZhbHVlOwp9CgpzdGF0aWMgaW50IHRlYTU3NTdfd3JpdGUoc3RydWN0IGJ0dHYgKmJ0diwgaW50IHZhbHVlKQp7CglpbnQgaTsKCWludCByZWcgPSB2YWx1ZTsKCglncGlvX2lub3V0KGJ0di0+bWJveF9tYXNrLCBidHYtPm1ib3hfY2xrIHwgYnR2LT5tYm94X3dlIHwgYnR2LT5tYm94X2RhdGEpOwoKCWlmIChidHYtPm1ib3hfaW9yKSB7CgkJZ3Bpb19iaXRzKGJ0di0+bWJveF9pb3IgfCBidHYtPm1ib3hfaW93IHwgYnR2LT5tYm94X2NzZWwsCgkJCSAgYnR2LT5tYm94X2lvciB8IGJ0di0+bWJveF9pb3cgfCBidHYtPm1ib3hfY3NlbCk7CgkJdWRlbGF5KDUpOwoJfQoJaWYgKGJ0dHZfZ3BpbykKCQlidHR2X2dwaW9fdHJhY2tpbmcoYnR2LCJ0ZWE1NzU3IHdyaXRlIik7CgoJZHByaW50aygiYnR0diVkOiB0ZWE1NzU3OiB3cml0ZSAweCVYXG4iLCBidHYtPmMubnIsIHZhbHVlKTsKCWJ1c19sb3coYnR2LGJ0di0+bWJveF9jbGspOwoJYnVzX2hpZ2goYnR2LGJ0di0+bWJveF93ZSk7Cglmb3IoaSA9IDA7IGkgPCAyNTsgaSsrKQoJewoJCWlmIChyZWcgJiAweDEwMDAwMDApCgkJCWJ1c19oaWdoKGJ0dixidHYtPm1ib3hfZGF0YSk7CgkJZWxzZQoJCQlidXNfbG93KGJ0dixidHYtPm1ib3hfZGF0YSk7CgkJcmVnIDw8PSAxOwoJCWJ1c19oaWdoKGJ0dixidHYtPm1ib3hfY2xrKTsKCQl1ZGVsYXkoMTApOwoJCWJ1c19sb3coYnR2LGJ0di0+bWJveF9jbGspOwoJCXVkZWxheSgxMCk7Cgl9CglidXNfbG93KGJ0dixidHYtPm1ib3hfd2UpOyAgLyogdW5tdXRlICEhISAqLwoJcmV0dXJuIDA7Cn0KCnZvaWQgdGVhNTc1N19zZXRfZnJlcShzdHJ1Y3QgYnR0diAqYnR2LCB1bnNpZ25lZCBzaG9ydCBmcmVxKQp7CglkcHJpbnRrKCJ0ZWE1NzU3X3NldF9mcmVxICVkXG4iLGZyZXEpOwoJdGVhNTc1N193cml0ZShidHYsIDUgKiBmcmVxICsgMHgzNTgpOyAvKiBhZGQgMTAuN01IeiAoc2VlIGRvY3MpICovCiNpZiAwCgkvKiBicmVha3MgTWlybyBQQ1RWICovCgl2YWx1ZSA9IHRlYTU3NTdfcmVhZChidHYpOwoJZHByaW50aygiYnR0diVkOiB0ZWE1NzU3IHJlYWRiYWNrPTB4JXhcbiIsYnR2LT5jLm5yLHZhbHVlKTsKI2VuZGlmCn0KCgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwovKiB3aW52aWV3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKdm9pZCB3aW52aWV3X2F1ZGlvKHN0cnVjdCBidHR2ICpidHYsIHN0cnVjdCB2aWRlb19hdWRpbyAqdiwgaW50IHNldCkKewoJLyogUFQyMjU0QSBwcm9ncmFtbWluZyBKb24gVG9tYnMsIGpvbkBndGUuZXNpLnVzLmVzICovCglpbnQgYml0c19vdXQsIGxvb3BzLCB2b2wsIGRhdGE7CgoJaWYgKCFzZXQpIHsKCQkvKiBGaXhlZCBieSBMZWFuZHJvIEx1Y2FyZWxsYSA8bHVjYUBsaW51eG1lbmRvemEub3JnLmFyICgwNy8zMS8wMSkgKi8KCQl2LT5mbGFncyB8PSBWSURFT19BVURJT19WT0xVTUU7CgkJcmV0dXJuOwoJfQoKCS8qIDMyIGxldmVscyBsb2dhcml0aG1pYyAqLwoJdm9sID0gMzIgLSAoKHYtPnZvbHVtZT4+MTEpKTsKCS8qIHVuaXRzICovCgliaXRzX291dCA9IChQVDIyNTRfREJTX0lOXzI+Pih2b2wlNSkpOwoJLyogdGVucyAqLwoJYml0c19vdXQgfD0gKFBUMjI1NF9EQlNfSU5fMTA+Pih2b2wvNSkpOwoJYml0c19vdXQgfD0gUFQyMjU0X0xfQ0hBTk5FTCB8IFBUMjI1NF9SX0NIQU5ORUw7CglkYXRhID0gZ3Bpb19yZWFkKCk7CglkYXRhICY9IH4oV0lOVklFV19QVDIyNTRfQ0xLfCBXSU5WSUVXX1BUMjI1NF9EQVRBfAoJCSAgV0lOVklFV19QVDIyNTRfU1RST0JFKTsKCWZvciAobG9vcHMgPSAxNzsgbG9vcHMgPj0gMCA7IGxvb3BzLS0pIHsKCQlpZiAoYml0c19vdXQgJiAoMTw8bG9vcHMpKQoJCQlkYXRhIHw9ICBXSU5WSUVXX1BUMjI1NF9EQVRBOwoJCWVsc2UKCQkJZGF0YSAmPSB+V0lOVklFV19QVDIyNTRfREFUQTsKCQlncGlvX3dyaXRlKGRhdGEpOwoJCXVkZWxheSg1KTsKCQlkYXRhIHw9IFdJTlZJRVdfUFQyMjU0X0NMSzsKCQlncGlvX3dyaXRlKGRhdGEpOwoJCXVkZWxheSg1KTsKCQlkYXRhICY9IH5XSU5WSUVXX1BUMjI1NF9DTEs7CgkJZ3Bpb193cml0ZShkYXRhKTsKCX0KCWRhdGEgfD0gIFdJTlZJRVdfUFQyMjU0X1NUUk9CRTsKCWRhdGEgJj0gfldJTlZJRVdfUFQyMjU0X0RBVEE7CglncGlvX3dyaXRlKGRhdGEpOwoJdWRlbGF5KDEwKTsKCWRhdGEgJj0gfldJTlZJRVdfUFQyMjU0X1NUUk9CRTsKCWdwaW9fd3JpdGUoZGF0YSk7Cn0KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi8qIG1vbm8vc3RlcmVvIGNvbnRyb2wgZm9yIHZhcmlvdXMgY2FyZHMgKHdoaWNoIGRvbid0IHVzZSBpMmMgY2hpcHMgYnV0ICAgICovCi8qIGNvbm5lY3Qgc29tZXRoaW5nIHRvIHRoZSBHUElPIHBpbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgpzdGF0aWMgdm9pZApndmJjdHYzcGNpX2F1ZGlvKHN0cnVjdCBidHR2ICpidHYsIHN0cnVjdCB2aWRlb19hdWRpbyAqdiwgaW50IHNldCkKewoJdW5zaWduZWQgaW50IGNvbiA9IDA7CgoJaWYgKHNldCkgewoJCWdwaW9faW5vdXQoMHgzMDAsIDB4MzAwKTsKCQlpZiAodi0+bW9kZSAmIFZJREVPX1NPVU5EX0xBTkcxKQoJCQljb24gPSAweDAwMDsKCQlpZiAodi0+bW9kZSAmIFZJREVPX1NPVU5EX0xBTkcyKQoJCQljb24gPSAweDMwMDsKCQlpZiAodi0+bW9kZSAmIFZJREVPX1NPVU5EX1NURVJFTykKCQkJY29uID0gMHgyMDA7Ci8vCQlpZiAodi0+bW9kZSAmIFZJREVPX1NPVU5EX01PTk8pCi8vCQkJY29uID0gMHgxMDA7CgkJZ3Bpb19iaXRzKDB4MzAwLCBjb24pOwoJfSBlbHNlIHsKCQl2LT5tb2RlID0gVklERU9fU09VTkRfU1RFUkVPIHwKCQkJICBWSURFT19TT1VORF9MQU5HMSAgfCBWSURFT19TT1VORF9MQU5HMjsKCX0KfQoKc3RhdGljIHZvaWQKZ3ZiY3R2NXBjaV9hdWRpbyhzdHJ1Y3QgYnR0diAqYnR2LCBzdHJ1Y3QgdmlkZW9fYXVkaW8gKnYsIGludCBzZXQpCnsKCXVuc2lnbmVkIGludCB2YWwsIGNvbjsKCiNpZiBCVFRWX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDAsOCwwKQoJaWYgKGJ0di0+cmFkaW9fdXNlcikKCQlyZXR1cm47CiNlbHNlCglpZiAoYnR2LT5yYWRpbykKCQlyZXR1cm47CiNlbmRpZgoKCXZhbCA9IGdwaW9fcmVhZCgpOwoJaWYgKHNldCkgewoJCWNvbiA9IDB4MDAwOwoJCWlmICh2LT5tb2RlICYgVklERU9fU09VTkRfTEFORzIpIHsKCQkJaWYgKHYtPm1vZGUgJiBWSURFT19TT1VORF9MQU5HMSkgewoJCQkJLyogTEFORzEgKyBMQU5HMiAqLwoJCQkJY29uID0gMHgxMDA7CgkJCX0KCQkJZWxzZSB7CgkJCQkvKiBMQU5HMiAqLwoJCQkJY29uID0gMHgzMDA7CgkJCX0KCQl9CgkJaWYgKGNvbiAhPSAodmFsICYgMHgzMDApKSB7CgkJCWdwaW9fYml0cygweDMwMCwgY29uKTsKCQkJaWYgKGJ0dHZfZ3BpbykKCQkJCWJ0dHZfZ3Bpb190cmFja2luZyhidHYsImd2YmN0djVwY2kiKTsKCQl9Cgl9IGVsc2UgewoJCXN3aXRjaCAodmFsICYgMHg3MCkgewoJCSAgY2FzZSAweDEwOgoJCQl2LT5tb2RlID0gVklERU9fU09VTkRfTEFORzEgfCBWSURFT19TT1VORF9MQU5HMjsKCQkJYnJlYWs7CgkJICBjYXNlIDB4MzA6CgkJCXYtPm1vZGUgPSBWSURFT19TT1VORF9MQU5HMjsKCQkJYnJlYWs7CgkJICBjYXNlIDB4NTA6CgkJCXYtPm1vZGUgPSBWSURFT19TT1VORF9MQU5HMTsKCQkJYnJlYWs7CgkJICBjYXNlIDB4NjA6CgkJCXYtPm1vZGUgPSBWSURFT19TT1VORF9TVEVSRU87CgkJCWJyZWFrOwoJCSAgY2FzZSAweDcwOgoJCQl2LT5tb2RlID0gVklERU9fU09VTkRfTU9OTzsKCQkJYnJlYWs7CgkJICBkZWZhdWx0OgoJCQl2LT5tb2RlID0gVklERU9fU09VTkRfTU9OTyB8IFZJREVPX1NPVU5EX1NURVJFTyB8CgkJCQkgIFZJREVPX1NPVU5EX0xBTkcxIHwgVklERU9fU09VTkRfTEFORzI7CgkJfQoJfQp9CgovKgogKiBNYXJpbyBNZWRpbmEgTnVzc2JhdW0gPG1lZGlzb2Z0QGFsb2hhYmJzLm9yZy5teD4KICogIEkgZGlzY292ZXIgdGhhdCBvbiBCVDg0OF9HUElPX0RBVEEgYWRkcmVzcyBhIGJ5dGUgMHhjY2UgZW5hYmxlIHN0ZXJlbywKICogIDB4ZGRlIGVuYWJsZXMgbW9ubyBhbmQgMHhjY2QgZW5hYmxlcyBzYXAKICoKICogUGV0ciBWYW5kcm92ZWMgPFZBTkRST1ZFQHZjLmN2dXQuY3o+CiAqICBQLlMuOiBBdCBsZWFzdCBtYXNrIGluIGxpbmUgYWJvdmUgaXMgd3JvbmcgLSBHUElPIHBpbnMgMywyIHNlbGVjdAogKiAgaW5wdXQvb3V0cHV0IHNvdW5kIGNvbm5lY3Rpb24sIHNvIGJvdGggbXVzdCBiZSBzZXQgZm9yIG91dHB1dCBtb2RlLgogKgogKiBMb29rcyBsaWtlIGl0J3MgbmVlZGVkIG9ubHkgZm9yIHRoZSAidHZwaG9uZSIsIHRoZSAidHZwaG9uZSA5OCIKICogaGFuZGxlcyB0aGlzIHdpdGggYSB0ZGE5ODQwCiAqCiAqLwpzdGF0aWMgdm9pZAphdmVybWVkaWFfdHZwaG9uZV9hdWRpbyhzdHJ1Y3QgYnR0diAqYnR2LCBzdHJ1Y3QgdmlkZW9fYXVkaW8gKnYsIGludCBzZXQpCnsKCWludCB2YWwgPSAwOwoKCWlmIChzZXQpIHsKCQlpZiAodi0+bW9kZSAmIFZJREVPX1NPVU5EX0xBTkcyKSAgIC8qIFNBUCAqLwoJCQl2YWwgPSAweDAyOwoJCWlmICh2LT5tb2RlICYgVklERU9fU09VTkRfU1RFUkVPKQoJCQl2YWwgPSAweDAxOwoJCWlmICh2YWwpIHsKCQkJZ3Bpb19iaXRzKDB4MDMsdmFsKTsKCQkJaWYgKGJ0dHZfZ3BpbykKCQkJCWJ0dHZfZ3Bpb190cmFja2luZyhidHYsImF2ZXJtZWRpYSIpOwoJCX0KCX0gZWxzZSB7CgkJdi0+bW9kZSA9IFZJREVPX1NPVU5EX01PTk8gfCBWSURFT19TT1VORF9TVEVSRU8gfAoJCQlWSURFT19TT1VORF9MQU5HMTsKCQlyZXR1cm47Cgl9Cn0KCnN0YXRpYyB2b2lkCmF2ZXJtZWRpYV90dl9zdGVyZW9fYXVkaW8oc3RydWN0IGJ0dHYgKmJ0diwgc3RydWN0IHZpZGVvX2F1ZGlvICp2LCBpbnQgc2V0KQp7CglpbnQgdmFsID0gMDsKCglpZiAoc2V0KSB7CgkJaWYgKHYtPm1vZGUgJiBWSURFT19TT1VORF9MQU5HMikgICAvKiBTQVAgKi8KCQkJdmFsID0gMHgwMTsKCQlpZiAodi0+bW9kZSAmIFZJREVPX1NPVU5EX1NURVJFTykgIC8qIFNURVJFTyAqLwoJCQl2YWwgPSAweDAyOwoJCWJ0YW9yKHZhbCwgfjB4MDMsIEJUODQ4X0dQSU9fREFUQSk7CgkJaWYgKGJ0dHZfZ3BpbykKCQkJYnR0dl9ncGlvX3RyYWNraW5nKGJ0diwiYXZlcm1lZGlhIik7Cgl9IGVsc2UgewoJCXYtPm1vZGUgPSBWSURFT19TT1VORF9NT05PIHwgVklERU9fU09VTkRfU1RFUkVPIHwKCQkJVklERU9fU09VTkRfTEFORzEgfCBWSURFT19TT1VORF9MQU5HMjsKCQlyZXR1cm47Cgl9Cn0KCi8qIExpZmV0ZWMgOTQxNSBoYW5kbGluZyAqLwpzdGF0aWMgdm9pZApsdDk0MTVfYXVkaW8oc3RydWN0IGJ0dHYgKmJ0diwgc3RydWN0IHZpZGVvX2F1ZGlvICp2LCBpbnQgc2V0KQp7CiAgICAgICAgaW50IHZhbCA9IDA7CgogICAgICAgIGlmIChncGlvX3JlYWQoKSAmIDB4NDAwMCkgewoJCXYtPm1vZGUgPSBWSURFT19TT1VORF9NT05POwoJCXJldHVybjsKCX0KCiAgICAgICAgaWYgKHNldCkgewogICAgICAgICAgICAgICAgaWYgKHYtPm1vZGUgJiBWSURFT19TT1VORF9MQU5HMikgIC8qIEEyIFNBUCAqLwogICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSAweDAwODA7CgkJaWYgKHYtPm1vZGUgJiBWSURFT19TT1VORF9TVEVSRU8pIC8qIEEyIHN0ZXJlbyAqLwogICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSAweDA4ODA7CiAgICAgICAgICAgICAgICBpZiAoKHYtPm1vZGUgJiBWSURFT19TT1VORF9MQU5HMSkgfHwKCQkgICAgKHYtPm1vZGUgJiBWSURFT19TT1VORF9NT05PKSkKCQkJdmFsID0gMDsKCQlncGlvX2JpdHMoMHgwODgwLCB2YWwpOwogICAgICAgICAgICAgICAgaWYgKGJ0dHZfZ3BpbykKICAgICAgICAgICAgICAgICAgICAgICAgYnR0dl9ncGlvX3RyYWNraW5nKGJ0diwibHQ5NDE1Iik7CiAgICAgICAgfSBlbHNlIHsKCQkvKiBhdXRvZGV0ZWN0IGRvZXNuJ3Qgd29yayB3aXRoIHRoaXMgY2FyZCA6LSggKi8KICAgICAgICAgICAgICAgIHYtPm1vZGUgPSBWSURFT19TT1VORF9NT05PIHwgVklERU9fU09VTkRfU1RFUkVPIHwKCQkJVklERU9fU09VTkRfTEFORzEgfCBWSURFT19TT1VORF9MQU5HMjsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9Cn0KCi8vIFREQTk4MjEgb24gVGVycmFUVisgQnQ4NDgsIEJ0ODc4CnN0YXRpYyB2b2lkCnRlcnJhdHZfYXVkaW8oc3RydWN0IGJ0dHYgKmJ0diwgc3RydWN0IHZpZGVvX2F1ZGlvICp2LCBpbnQgc2V0KQp7Cgl1bnNpZ25lZCBpbnQgY29uID0gMDsKCglpZiAoc2V0KSB7CgkJZ3Bpb19pbm91dCgweDE4MDAwMCwweDE4MDAwMCk7CgkJaWYgKHYtPm1vZGUgJiBWSURFT19TT1VORF9MQU5HMikKCQkJY29uID0gMHgwODAwMDA7CgkJaWYgKHYtPm1vZGUgJiBWSURFT19TT1VORF9TVEVSRU8pCgkJCWNvbiA9IDB4MTgwMDAwOwoJCWdwaW9fYml0cygweDE4MDAwMCwgY29uKTsKCQlpZiAoYnR0dl9ncGlvKQoJCQlidHR2X2dwaW9fdHJhY2tpbmcoYnR2LCJ0ZXJyYXR2Iik7Cgl9IGVsc2UgewoJCXYtPm1vZGUgPSBWSURFT19TT1VORF9NT05PIHwgVklERU9fU09VTkRfU1RFUkVPIHwKCQkJVklERU9fU09VTkRfTEFORzEgfCBWSURFT19TT1VORF9MQU5HMjsKCX0KfQoKc3RhdGljIHZvaWQKd2luZmFzdDIwMDBfYXVkaW8oc3RydWN0IGJ0dHYgKmJ0diwgc3RydWN0IHZpZGVvX2F1ZGlvICp2LCBpbnQgc2V0KQp7Cgl1bnNpZ25lZCBsb25nIHZhbCA9IDA7CgoJaWYgKHNldCkgewoJCS8qYnRvciAoMHhjMzIwMDAsIEJUODQ4X0dQSU9fT1VUX0VOKTsqLwoJCWlmICh2LT5tb2RlICYgVklERU9fU09VTkRfTU9OTykJCS8qIE1vbm8gKi8KCQkJdmFsID0gMHg0MjAwMDA7CgkJaWYgKHYtPm1vZGUgJiBWSURFT19TT1VORF9MQU5HMSkJLyogTW9ubyAqLwoJCQl2YWwgPSAweDQyMDAwMDsKCQlpZiAodi0+bW9kZSAmIFZJREVPX1NPVU5EX0xBTkcyKQkvKiBTQVAgKi8KCQkJdmFsID0gMHg0MTAwMDA7CgkJaWYgKHYtPm1vZGUgJiBWSURFT19TT1VORF9TVEVSRU8pCS8qIFN0ZXJlbyAqLwoJCQl2YWwgPSAweDAyMDAwMDsKCQlpZiAodmFsKSB7CgkJCWdwaW9fYml0cygweDQzMDAwMCwgdmFsKTsKCQkJaWYgKGJ0dHZfZ3BpbykKCQkJCWJ0dHZfZ3Bpb190cmFja2luZyhidHYsIndpbmZhc3QyMDAwIik7CgkJfQoJfSBlbHNlIHsKCQl2LT5tb2RlID0gVklERU9fU09VTkRfTU9OTyB8IFZJREVPX1NPVU5EX1NURVJFTyB8CgkJCSAgVklERU9fU09VTkRfTEFORzEgfCBWSURFT19TT1VORF9MQU5HMjsKCX0KfQoKLyoKICogRGFyaXVzeiBLb3dhbGV3c2tpIDxkYXJla2tAYXV0b21leC5wbD4KICogc291bmQgY29udHJvbCBmb3IgUHJvbGluayBQVi1CVDg3OFArOUIgKFBpeGVsVmlldyBQbGF5VFYgUHJvIEZNK05JQ0FNCiAqIHJldmlzaW9uIDlCIGhhcyBvbi1ib2FyZCBUREE5ODc0QSBzb3VuZCBkZWNvZGVyKS4KICoKICogTm90ZTogVGhlcmUgYXJlIGNhcmQgdmFyaWFudHMgd2l0aG91dCB0ZGE5ODc0YS4gRm9yY2luZyB0aGUgInN0ZXJlbyBzb3VuZCByb3V0ZSIKICogICAgICAgd2lsbCBtdXRlIHRoaXMgY2FyZHMuCiAqLwpzdGF0aWMgdm9pZApwdmJ0ODc4cDliX2F1ZGlvKHN0cnVjdCBidHR2ICpidHYsIHN0cnVjdCB2aWRlb19hdWRpbyAqdiwgaW50IHNldCkKewoJdW5zaWduZWQgaW50IHZhbCA9IDA7CgojaWYgQlRUVl9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigwLDgsMCkKCWlmIChidHYtPnJhZGlvX3VzZXIpCgkJcmV0dXJuOwojZWxzZQoJaWYgKGJ0di0+cmFkaW8pCgkJcmV0dXJuOwojZW5kaWYKCglpZiAoc2V0KSB7CgkJaWYgKHYtPm1vZGUgJiBWSURFT19TT1VORF9NT05PKQl7CgkJCXZhbCA9IDB4MDE7CgkJfQoJCWlmICgodi0+bW9kZSAmIChWSURFT19TT1VORF9MQU5HMSB8IFZJREVPX1NPVU5EX0xBTkcyKSkKCQkgICAgfHwgKHYtPm1vZGUgJiBWSURFT19TT1VORF9TVEVSRU8pKSB7CgkJCXZhbCA9IDB4MDI7CgkJfQoJCWlmICh2YWwpIHsKCQkJZ3Bpb19iaXRzKDB4MDMsdmFsKTsKCQkJaWYgKGJ0dHZfZ3BpbykKCQkJCWJ0dHZfZ3Bpb190cmFja2luZyhidHYsInB2YnQ4NzhwOWIiKTsKCQl9Cgl9IGVsc2UgewoJCXYtPm1vZGUgPSBWSURFT19TT1VORF9NT05PIHwgVklERU9fU09VTkRfU1RFUkVPIHwKCQkJVklERU9fU09VTkRfTEFORzEgfCBWSURFT19TT1VORF9MQU5HMjsKCX0KfQoKLyoKICogRGFyaXVzeiBLb3dhbGV3c2tpIDxkYXJla2tAYXV0b21leC5wbD4KICogc291bmQgY29udHJvbCBmb3IgRmx5VmlkZW8gMjAwMFMgKHdpdGggdGRhOTg3NCBkZWNvZGVyKQogKiBiYXNlZCBvbiBwdmJ0ODc4cDliX2F1ZGlvKCkgLSB0aGlzIGlzIG5vdCB0ZXN0ZWQsIHBsZWFzZSBmaXghISEKICovCnN0YXRpYyB2b2lkCmZ2MjAwMHNfYXVkaW8oc3RydWN0IGJ0dHYgKmJ0diwgc3RydWN0IHZpZGVvX2F1ZGlvICp2LCBpbnQgc2V0KQp7Cgl1bnNpZ25lZCBpbnQgdmFsID0gMHhmZmZmOwoKI2lmIEJUVFZfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMCw4LDApCglpZiAoYnR2LT5yYWRpb191c2VyKQoJCXJldHVybjsKI2Vsc2UKCWlmIChidHYtPnJhZGlvKQoJCXJldHVybjsKI2VuZGlmCglpZiAoc2V0KSB7CgkJaWYgKHYtPm1vZGUgJiBWSURFT19TT1VORF9NT05PKQl7CgkJCXZhbCA9IDB4MDAwMDsKCQl9CgkJaWYgKCh2LT5tb2RlICYgKFZJREVPX1NPVU5EX0xBTkcxIHwgVklERU9fU09VTkRfTEFORzIpKQoJCSAgICB8fCAodi0+bW9kZSAmIFZJREVPX1NPVU5EX1NURVJFTykpIHsKCQkJdmFsID0gMHgxMDgwOyAvLy1kay0/Pz86IDB4MDg4MCwgMHgwMDgwLCAweDE4MDAgLi4uCgkJfQoJCWlmICh2YWwgIT0gMHhmZmZmKSB7CgkJCWdwaW9fYml0cygweDE4MDAsIHZhbCk7CgkJCWlmIChidHR2X2dwaW8pCgkJCQlidHR2X2dwaW9fdHJhY2tpbmcoYnR2LCJmdjIwMDBzIik7CgkJfQoJfSBlbHNlIHsKCQl2LT5tb2RlID0gVklERU9fU09VTkRfTU9OTyB8IFZJREVPX1NPVU5EX1NURVJFTyB8CgkJCVZJREVPX1NPVU5EX0xBTkcxIHwgVklERU9fU09VTkRfTEFORzI7Cgl9Cn0KCi8qCiAqIHNvdW5kIGNvbnRyb2wgZm9yIENhbm9wdXMgV2luRFZSIFBDSQogKiBNYXNha2kgU3V6dWtpIDxtYXNha2lAYnRyZWUub3JnPgogKi8Kc3RhdGljIHZvaWQKd2luZHZyX2F1ZGlvKHN0cnVjdCBidHR2ICpidHYsIHN0cnVjdCB2aWRlb19hdWRpbyAqdiwgaW50IHNldCkKewogICAgICAgIHVuc2lnbmVkIGxvbmcgdmFsID0gMDsKCiAgICAgICAgaWYgKHNldCkgewogICAgICAgICAgICAgICAgaWYgKHYtPm1vZGUgJiBWSURFT19TT1VORF9NT05PKQogICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSAweDA0MDAwMDsKICAgICAgICAgICAgICAgIGlmICh2LT5tb2RlICYgVklERU9fU09VTkRfTEFORzEpCiAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IDA7CiAgICAgICAgICAgICAgICBpZiAodi0+bW9kZSAmIFZJREVPX1NPVU5EX0xBTkcyKQogICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSAweDEwMDAwMDsKICAgICAgICAgICAgICAgIGlmICh2LT5tb2RlICYgVklERU9fU09VTkRfU1RFUkVPKQogICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSAwOwogICAgICAgICAgICAgICAgaWYgKHZhbCkgewoJCQlncGlvX2JpdHMoMHgxNDAwMDAsIHZhbCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChidHR2X2dwaW8pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnR0dl9ncGlvX3RyYWNraW5nKGJ0diwid2luZHZyIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHYtPm1vZGUgPSBWSURFT19TT1VORF9NT05PIHwgVklERU9fU09VTkRfU1RFUkVPIHwKICAgICAgICAgICAgICAgICAgICAgICAgICBWSURFT19TT1VORF9MQU5HMSB8IFZJREVPX1NPVU5EX0xBTkcyOwogICAgICAgIH0KfQoKLyoKICogc291bmQgY29udHJvbCBmb3IgQUQtVFZLNTAzCiAqIEhpcm9zaGkgVGFrZWthd2EgPHNpYW5AYmlnLm9yLmpwPgogKi8Kc3RhdGljIHZvaWQKYWR0dms1MDNfYXVkaW8oc3RydWN0IGJ0dHYgKmJ0diwgc3RydWN0IHZpZGVvX2F1ZGlvICp2LCBpbnQgc2V0KQp7Cgl1bnNpZ25lZCBpbnQgY29uID0gMHhmZmZmZmY7CgoJLy9idGFvcigweDFlMDAwMCwgfjB4MWUwMDAwLCBCVDg0OF9HUElPX09VVF9FTik7CgoJaWYgKHNldCkgewoJCS8vYnRvcigqKiosIEJUODQ4X0dQSU9fT1VUX0VOKTsKCQlpZiAodi0+bW9kZSAmIFZJREVPX1NPVU5EX0xBTkcxKQoJCQljb24gPSAweDAwMDAwMDAwOwoJCWlmICh2LT5tb2RlICYgVklERU9fU09VTkRfTEFORzIpCgkJCWNvbiA9IDB4MDAxODAwMDA7CgkJaWYgKHYtPm1vZGUgJiBWSURFT19TT1VORF9TVEVSRU8pCgkJCWNvbiA9IDB4MDAwMDAwMDA7CgkJaWYgKHYtPm1vZGUgJiBWSURFT19TT1VORF9NT05PKQoJCQljb24gPSAweDAwMDYwMDAwOwoJCWlmIChjb24gIT0gMHhmZmZmZmYpIHsKCQkJZ3Bpb19iaXRzKDB4MWUwMDAwLGNvbik7CgkJCWlmIChidHR2X2dwaW8pCgkJCQlidHR2X2dwaW9fdHJhY2tpbmcoYnR2LCAiYWR0dms1MDMiKTsKCQl9Cgl9IGVsc2UgewoJCXYtPm1vZGUgPSBWSURFT19TT1VORF9NT05PIHwgVklERU9fU09VTkRfU1RFUkVPIHwKCQkJICBWSURFT19TT1VORF9MQU5HMSAgfCBWSURFT19TT1VORF9MQU5HMjsKCX0KfQoKLyogUmVtb3RlVmlzaW9uIE1YIChydjYwNSkgbXV4c2VsIGhlbHBlciBbTWlndWVsIEZyZWl0YXNdCiAqCiAqIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2UgcnY2MDUgZG9uJ3QgdXNlIGEgbm9ybWFsIG11bHRpcGxleCwgYnV0IGEgY3Jvc3Nwb2ludAogKiBzd2l0Y2ggaW5zdGVhZCAoQ0QyMk0zNDk0RSkuIFRoaXMgSUMgY2FuIGhhdmUgbXVsdGlwbGUgYWN0aXZlIGNvbm5lY3Rpb25zCiAqIGJldHdlZW4gWG4gKGlucHV0KSBhbmQgWW4gKG91dHB1dCkgcGlucy4gV2UgbmVlZCB0byBjbGVhciBhbnkgZXhpc3RpbmcKICogY29ubmVjdGlvbiBwcmlvciB0byBlc3RhYmxpc2ggYSBuZXcgb25lLCBwdWxzaW5nIHRoZSBTVFJPQkUgcGluLgogKgogKiBUaGUgYm9hcmQgaGFyZHdpcmUgWTAgKHhwb2ludCkgdG8gTVVYMSBhbmQgTVVYT1VUIHRvIFlpbi4KICogR1BJTyBwaW5zIGFyZSB3aXJlZCBhczoKICogIEdQSU9bMDozXSAtIEFYWzA6M10gKHhwb2ludCkgLSBQMVswOjNdIChtaWNyb2NvbnRyb2xlcikKICogIEdQSU9bNDo2XSAtIEFZWzA6Ml0gKHhwb2ludCkgLSBQMVs0OjZdIChtaWNyb2NvbnRyb2xlcikKICogIEdQSU9bN10gICAtIERBVEEgKHhwb2ludCkgICAgLSBQMVs3XSAobWljcm9jb250cm9sZXIpCiAqICBHUElPWzhdICAgLSAgICAgICAgICAgICAgICAgIC0gUDNbNV0gKG1pY3JvY29udHJvbGVyKQogKiAgR1BJT1s5XSAgIC0gUkVTRVQgKHhwb2ludCkgICAtIFAzWzZdIChtaWNyb2NvbnRyb2xlcikKICogIEdQSU9bMTBdICAtIFNUUk9CRSAoeHBvaW50KSAgLSBQM1s3XSAobWljcm9jb250cm9sZXIpCiAqICBHUElOVFIgICAgLSAgICAgICAgICAgICAgICAgIC0gUDNbNF0gKG1pY3JvY29udHJvbGVyKQogKgogKiBUaGUgbWljcm9jb250cm9sZXIgaXMgYSA4MEMzMiBsaWtlLiBJdCBzaG91bGQgYmUgcG9zc2libGUgdG8gY2hhbmdlIHhwb2ludAogKiBjb25maWd1cmF0aW9uIGVpdGhlciBkaXJlY3RseSAoYXMgd2UgYXJlIGRvaW5nKSBvciB1c2luZyB0aGUgbWljcm9jb250cm9sZXIKICogd2hpY2ggaXMgYWxzbyB3aXJlZCB0byBJMkMgaW50ZXJmYWNlLiBJIGhhdmUgbm8gZnVydGhlciBpbmZvIG9uIHRoZQogKiBtaWNyb2NvbnRyb2xlciBmZWF0dXJlcywgb25lIHdvdWxkIG5lZWQgdG8gZGlzYXNzZW1ibHkgdGhlIGZpcm13YXJlLgogKiBub3RlOiB0aGUgdmVuZG9yIHJlZnVzZWQgdG8gZ2l2ZSBhbnkgaW5mb3JtYXRpb24gb24gdGhpcyBwcm9kdWN0LCBhbGwKICogICAgICAgdGhhdCBzdHVmZiB3YXMgZm91bmQgdXNpbmcgYSBtdWx0aW1ldGVyISA6KQogKi8Kc3RhdGljIHZvaWQgcnY2MDVfbXV4c2VsKHN0cnVjdCBidHR2ICpidHYsIHVuc2lnbmVkIGludCBpbnB1dCkKewoJLyogcmVzZXQgYWxsIGNvbmVjdGlvbnMgKi8KCWdwaW9fYml0cygweDIwMCwweDIwMCk7CgltZGVsYXkoMSk7CglncGlvX2JpdHMoMHgyMDAsMHgwMDApOwoJbWRlbGF5KDEpOwoKCS8qIGNyZWF0ZSBhIG5ldyBjb25lY3Rpb24gKi8KCWdwaW9fYml0cygweDQ4MCwweDA4MCk7CglncGlvX2JpdHMoMHg0ODAsMHg0ODApOwoJbWRlbGF5KDEpOwoJZ3Bpb19iaXRzKDB4NDgwLDB4MDgwKTsKCW1kZWxheSgxKTsKfQoKLyogVGliZXQgU3lzdGVtcyAnUHJvZ3Jlc3MgRFZSJyBDUzE2IG11eHNlbCBoZWxwZXIgW0NocmlzIEZhbm5pbmddCiAqCiAqIFRoZSBDUzE2IChhdmFpbGFibGUgb24gZUJheSBjaGVhcCkgaXMgYSBQQ0kgYm9hcmQgd2l0aCBmb3VyIEZ1c2lvbgogKiA4NzhBIGNoaXBzLCBhIFBDSSBicmlkZ2UsIGFuIEF0bWVsIG1pY3JvY29udHJvbGxlciwgZm91ciBzeW5jIHNlcGVyYXRvcgogKiBjaGlwcywgdGVuIGVpZ2h0IGlucHV0IGFuYWxvZyBtdWx0aXBsZXhvcnMsIGEgbm90IGNoaXAgYW5kIGEgZmV3CiAqIG90aGVyIGNvbXBvbmVudHMuCiAqCiAqIDE2IGlucHV0cyBvbiBhIHNlY29uZGFyeSBicmFja2V0IGFyZSBwcm92aWRlZCBhbmQgY2FuIGJlIHNlbGVjdGVkCiAqIGZyb20gZWFjaCBvZiB0aGUgZm91ciBjYXB0dXJlIGNoaXBzLiAgVHdvIG9mIHRoZSBlaWdodCBpbnB1dAogKiBtdWx0aXBsZXhvcnMgYXJlIHVzZWQgdG8gc2VsZWN0IGZyb20gYW55IG9mIHRoZSAxNiBpbnB1dCBzaWduYWxzLgogKgogKiBVbnN1cHBvcnRlZCBoYXJkd2FyZSBjYXBhYmlsaXRpZXM6CiAqICAuIEEgdmlkZW8gb3V0cHV0IG1vbml0b3Igb24gdGhlIHNlY29uZGFyeSBicmFja2V0IGNhbiBiZSBzZWxlY3RlZCBmcm9tCiAqICAgIG9uZSBvZiB0aGUgODc4QSBjaGlwcy4KICogIC4gQW5vdGhlciBwYXNzdGhyb3VnaCBidXQgSSBoYXZlbid0IHNwZW50IGFueSB0aW1lIGludmVzdGlnYXRpbmcgaXQuCiAqICAuIERpZ2l0YWwgSS9PIChsb2dpYyBsZXZlbCBjb25uZWN0ZWQgdG8gR1BJTykgaXMgYXZhaWxhYmxlIGZyb20gYW4KICogICAgb25ib2FyZCBoZWFkZXIuCiAqCiAqIFRoZSBvbiBjaGlwIGlucHV0IG11eCBzaG91bGQgYWx3YXlzIGJlIHNldCB0byAyLgogKiBHUElPWzE2OjE5XSAtIFZpZGVvIGlucHV0IHNlbGVjdGlvbgogKiBHUElPWzA6M10gICAtIFZpZGVvIG91dHB1dCBtb25pdG9yIHNlbGVjdCAob25seSBhdmFpbGFibGUgZnJvbSBvbmUgODc4QSkKICogR1BJT1s/Oj9dICAgLSBEaWdpdGFsIEkvTy4KICoKICogVGhlcmUgaXMgYW4gQVRNRUwgbWljcm9jb250cm9sbGVyIHdpdGggYW4gODAzMSBjb3JlIG9uIGJvYXJkLiAgSSBoYXZlIG5vdAogKiBkZXRlcm1pbmVkIHdoYXQgZnVuY3Rpb24gKGlmIGFueSkgaXQgcHJvdmlkZXMuICBXaXRoIHRoZSBtaWNyb2NvbnRyb2xsZXIKICogYW5kIHN5bmMgc2VwZXJhdG9yIGNoaXBzIGEgZ3Vlc3MgaXMgdGhhdCBpdCBtaWdodCBoYXZlIHRvIGRvIHdpdGggdmlkZW8KICogc3dpdGNoaW5nIGFuZCBtYXliZSBzb21lIGRpZ2l0YWwgSS9PLgogKi8Kc3RhdGljIHZvaWQgdGliZXRDUzE2X211eHNlbChzdHJ1Y3QgYnR0diAqYnR2LCB1bnNpZ25lZCBpbnQgaW5wdXQpCnsKCS8qIHZpZGVvIG11eCAqLwoJZ3Bpb19iaXRzKDB4MGYwMDAwLCBpbnB1dCA8PCAxNik7Cn0KCnN0YXRpYyB2b2lkIHRpYmV0Q1MxNl9pbml0KHN0cnVjdCBidHR2ICpidHYpCnsKCS8qIGVuYWJsZSBncGlvIGJpdHMsIG1hc2sgb2J0YWluZWQgdmlhIGJ0U3B5ICovCglncGlvX2lub3V0KDB4ZmZmZmZmLCAweDBmN2ZmZik7CglncGlvX3dyaXRlKDB4MGY3ZmZmKTsKfQoKLyoKICogVGhlIGZvbGxvd2luZyByb3V0aW5lcyBmb3IgdGhlIEtvZGljb20tNDQwMHIgZ2V0IGEgbGl0dGxlIG1pbmQtdHdpc3RpbmcuCiAqIFRoZXJlIGlzIGEgIm1hc3RlciIgY29udHJvbGxlciBhbmQgdGhyZWUgInNsYXZlIiBjb250cm9sbGVycywgdG9nZXRoZXIKICogYW4gYW5hbG9nIHN3aXRjaCB3aGljaCBjb25uZWN0cyBhbnkgb2YgMTYgY2FtZXJhcyB0byBhbnkgb2YgdGhlIEJUODdBJ3MuCiAqIFRoZSBhbmFsb2cgc3dpdGNoIGlzIGNvbnRyb2xsZWQgYnkgdGhlICJtYXN0ZXIiLCBidXQgdGhlIGRldGVjdGlvbiBvcmRlcgogKiBvZiB0aGUgZm91ciBCVDg3OEEgY2hpcHMgaXMgaW4gYW4gb3JkZXIgd2hpY2ggSSBqdXN0IGRvbid0IHVuZGVyc3RhbmQuCiAqIFRoZSAibWFzdGVyIiBpcyBhY3R1YWxseSB0aGUgc2Vjb25kIGNvbnRyb2xsZXIgdG8gYmUgZGV0ZWN0ZWQuICBUaGUKICogbG9naWMgb24gdGhlIGJvYXJkIHVzZXMgbG9naWNhbCBudW1iZXJzIGZvciB0aGUgNCBjb250cm9sZXJzLCBidXQKICogdGhvc2UgbnVtYmVycyBhcmUgZGlmZmVyZW50IGZyb20gdGhlIGRldGVjdGlvbiBzZXF1ZW5jZS4gIFdoZW4gd29ya2luZwogKiB3aXRoIHRoZSBhbmFsb2cgc3dpdGNoLCB3ZSBuZWVkIHRvICJtYXAiIGZyb20gdGhlIGRldGVjdGlvbiBzZXF1ZW5jZQogKiBvdmVyIHRvIHRoZSBib2FyZCdzIGxvZ2ljYWwgY29udHJvbGxlciBudW1iZXIuICBUaGlzIG1hcHBpbmcgc2VxdWVuY2UKICogaXMgezMsIDAsIDIsIDF9LCBpLmUuIHRoZSBmaXJzdCBjb250cm9sbGVyIHRvIGJlIGRldGVjdGVkIGlzIGxvZ2ljYWwKICogdW5pdCAzLCB0aGUgc2Vjb25kICh3aGljaCBpcyB0aGUgbWFzdGVyKSBpcyBsb2dpY2FsIHVuaXQgMCwgZXRjLgogKiBXZSBuZWVkIHRvIG1haW50YWluIHRoZSBzdGF0dXMgb2YgdGhlIGFuYWxvZyBzd2l0Y2ggKHdoaWNoIG9mIHRoZSAxNgogKiBjYW1lcmFzIGlzIGNvbm5lY3RlZCB0byB3aGljaCBvZiB0aGUgNCBjb250cm9sbGVycykuICBSYXRoZXIgdGhhbgogKiBhZGQgdG8gdGhlIGJ0dHYgc3RydWN0dXJlIGZvciB0aGlzLCB3ZSB1c2UgdGhlIGRhdGEgcmVzZXJ2ZWQgZm9yCiAqIHRoZSBtYm94ICh1bnVzZWQgZm9yIHRoaXMgY2FyZCB0eXBlKS4KICovCgovKgogKiBGaXJzdCBhIHJvdXRpbmUgdG8gc2V0IHRoZSBhbmFsb2cgc3dpdGNoLCB3aGljaCBjb250cm9scyB3aGljaCBjYW1lcmEKICogaXMgcm91dGVkIHRvIHdoaWNoIGNvbnRyb2xsZXIuICBUaGUgc3dpdGNoIGNvbXByaXNlcyBhbiBYLWFkZHJlc3MKICogKGdwaW8gYml0cyAwLTMsIHJlcHJlc2VudGluZyB0aGUgY2FtZXJhLCByYW5naW5nIGZyb20gMC0xNSksIGFuZCBhCiAqIFktYWRkcmVzcyAoZ3BpbyBiaXRzIDQtNiwgcmVwcmVzZW50aW5nIHRoZSBjb250cm9sbGVyLCByYW5naW5nIGZyb20gMC0zKS4KICogQSBkYXRhIHZhbHVlIChncGlvIGJpdCA3KSBvZiAnMScgZW5hYmxlcyB0aGUgc3dpdGNoLCBhbmQgJzAnIGRpc2FibGVzCiAqIHRoZSBzd2l0Y2guICBBIFNUUk9CRSBiaXQgKGdwaW8gYml0IDgpIGxhdGNoZXMgdGhlIGRhdGEgdmFsdWUgaW50byB0aGUKICogc3BlY2lmaWVkIGFkZHJlc3MuICBUaGUgaWRlYSBpcyB0byBzZXQgdGhlIGFkZHJlc3MgYW5kIGRhdGEsIHRoZW4gYnJpbmcKICogU1RST0JFIGhpZ2gsIGFuZCBmaW5hbGx5IGJyaW5nIFNUUk9CRSBiYWNrIHRvIGxvdy4KICovCnN0YXRpYyB2b2lkIGtvZGljb200NDAwcl93cml0ZShzdHJ1Y3QgYnR0diAqYnR2LAoJCQkgICAgICAgdW5zaWduZWQgY2hhciB4YWRkciwKCQkJICAgICAgIHVuc2lnbmVkIGNoYXIgeWFkZHIsCgkJCSAgICAgICB1bnNpZ25lZCBjaGFyIGRhdGEpIHsKCXVuc2lnbmVkIGludCB1ZGF0YTsKCgl1ZGF0YSA9IChkYXRhIDw8IDcpIHwgKCh5YWRkciYzKSA8PCA0KSB8ICh4YWRkciYweGYpOwoJZ3Bpb19iaXRzKDB4MWZmLCB1ZGF0YSk7CQkvKiB3cml0ZSBBRERSIGFuZCBEQVQgKi8KCWdwaW9fYml0cygweDFmZiwgdWRhdGEgfCAoMSA8PCA4KSk7CS8qIHN0cm9iZSBoaWdoICovCglncGlvX2JpdHMoMHgxZmYsIHVkYXRhKTsJCS8qIHN0cm9iZSBsb3cgKi8KfQoKLyoKICogTmV4dCB0aGUgbXV4IHNlbGVjdC4gIEJvdGggdGhlICJtYXN0ZXIiIGFuZCAic2xhdmUiICdjYXJkcycgKGNvbnRyb2xsZXJzKQogKiB1c2UgdGhpcyByb3V0aW5lLiAgVGhlIHJvdXRpbmUgZmluZHMgdGhlICJtYXN0ZXIiIGZvciB0aGUgY2FyZCwgbWFwcwogKiB0aGUgY29udHJvbGxlciBudW1iZXIgZnJvbSB0aGUgZGV0ZWN0ZWQgcG9zaXRpb24gb3ZlciB0byB0aGUgbG9naWNhbAogKiBudW1iZXIsIHdyaXRlcyB0aGUgYXBwcm9wcmlhdGUgZGF0YSB0byB0aGUgYW5hbG9nIHN3aXRjaCwgYW5kIGhvdXNla2VlcHMKICogdGhlIGxvY2FsIGNvcHkgb2YgdGhlIHN3aXRjaCBpbmZvcm1hdGlvbi4gIFRoZSBwYXJhbWV0ZXIgJ2lucHV0JyBpcyB0aGUKICogcmVxdWVzdGVkIGNhbWVyYSBudW1iZXIgKDAgLSAxNSkuCiAqLwpzdGF0aWMgdm9pZCBrb2RpY29tNDQwMHJfbXV4c2VsKHN0cnVjdCBidHR2ICpidHYsIHVuc2lnbmVkIGludCBpbnB1dCkKewoJY2hhciAqc3dfc3RhdHVzOwoJaW50IHhhZGRyLCB5YWRkcjsKCXN0cnVjdCBidHR2ICptY3RscjsKCXN0YXRpYyB1bnNpZ25lZCBjaGFyIG1hcFs0XSA9IHszLCAwLCAyLCAxfTsKCgltY3RsciA9IG1hc3RlcltidHYtPmMubnJdOwoJaWYgKG1jdGxyID09IE5VTEwpIHsJLyogaWdub3JlIGlmIG1hc3RlciBub3QgeWV0IGRldGVjdGVkICovCgkJcmV0dXJuOwoJfQoJeWFkZHIgPSAoYnR2LT5jLm5yIC0gbWN0bHItPmMubnIgKyAxKSAmIDM7IC8qIHRoZSAnJicgaXMgZm9yIHNhZmV0eSAqLwoJeWFkZHIgPSBtYXBbeWFkZHJdOwoJc3dfc3RhdHVzID0gKGNoYXIgKikoJm1jdGxyLT5tYm94X3dlKTsKCXhhZGRyID0gaW5wdXQgJiAweGY7CgkvKiBDaGVjayBpZiB0aGUgY29udHJvbGxlci9jYW1lcmEgcGFpciBoYXMgY2hhbmdlZCwgZWxzZSBpZ25vcmUgKi8KCWlmIChzd19zdGF0dXNbeWFkZHJdICE9IHhhZGRyKQoJewoJCS8qICJvcGVuIiB0aGUgb2xkIHN3aXRjaCwgImNsb3NlIiB0aGUgbmV3IG9uZSwgc2F2ZSB0aGUgbmV3ICovCgkJa29kaWNvbTQ0MDByX3dyaXRlKG1jdGxyLCBzd19zdGF0dXNbeWFkZHJdLCB5YWRkciwgMCk7CgkJc3dfc3RhdHVzW3lhZGRyXSA9IHhhZGRyOwoJCWtvZGljb200NDAwcl93cml0ZShtY3RsciwgeGFkZHIsIHlhZGRyLCAxKTsKCX0KfQoKLyoKICogRHVyaW5nIGluaXRpYWxpc2F0aW9uLCB3ZSBuZWVkIHRvIHJlc2V0IHRoZSBhbmFsb2cgc3dpdGNoLiAgV2UKICogYWxzbyBwcmVzZXQgdGhlIHN3aXRjaCB0byBtYXAgdGhlIDQgY29ubmVjdG9ycyBvbiB0aGUgY2FyZCB0byB0aGUKICogKnVzZXIncyogKHNlZSBhYm92ZSBkZXNjcmlwdGlvbiBvZiBrb2RpY29tNDQwMHJfbXV4c2VsKSBjaGFubmVscwogKiAwIHRocm91Z2ggMwogKi8Kc3RhdGljIHZvaWQga29kaWNvbTQ0MDByX2luaXQoc3RydWN0IGJ0dHYgKmJ0dikKewoJY2hhciAqc3dfc3RhdHVzID0gKGNoYXIgKikoJmJ0di0+bWJveF93ZSk7CglpbnQgaXg7CgoJZ3Bpb19pbm91dCgweDAwMDNmZiwgMHgwMDAzZmYpOwoJZ3Bpb193cml0ZSgxIDw8IDkpOwkvKiByZXNldCBNVVggKi8KCWdwaW9fd3JpdGUoMCk7CgkvKiBQcmVzZXQgY2FtZXJhIDAgdG8gdGhlIDQgY29udHJvbGxlcnMgKi8KCWZvciAoaXg9MDsgaXg8NDsgaXgrKykgewoJCXN3X3N0YXR1c1tpeF0gPSBpeDsKCQlrb2RpY29tNDQwMHJfd3JpdGUoYnR2LCBpeCwgaXgsIDEpOwoJfQoJLyoKCSAqIFNpbmNlIHRoaXMgaXMgdGhlICJtYXN0ZXIiLCB3ZSBuZWVkIHRvIHNldCB1cCB0aGUKCSAqIG90aGVyIHRocmVlIGNvbnRyb2xsZXIgY2hpcHMnIHBvaW50ZXJzIHRvIHRoaXMgc3RydWN0dXJlCgkgKiBmb3IgbGF0ZXIgdXNlIGluIHRoZSBtdXhzZWwgcm91dGluZS4KCSAqLwoJaWYgKChidHYtPmMubnI8MSkgfHwgKGJ0di0+Yy5ucj5CVFRWX01BWC0zKSkKCSAgICByZXR1cm47CgltYXN0ZXJbYnR2LT5jLm5yLTFdID0gYnR2OwoJbWFzdGVyW2J0di0+Yy5ucl0gICA9IGJ0djsKCW1hc3RlcltidHYtPmMubnIrMV0gPSBidHY7CgltYXN0ZXJbYnR2LT5jLm5yKzJdID0gYnR2Owp9CgovLyBUaGUgR3JhbmR0ZWMgWC1HdWFyZCBmcmFtZWdyYWJiZXIgY2FyZCB1c2VzIHR3byBEdWFsIDQtY2hhbm5lbAovLyB2aWRlbyBtdWx0aXBsZXhlcnMgdG8gcHJvdmlkZSB1cCB0byAxNiB2aWRlbyBpbnB1dHMuIFRoZXNlCi8vIG11bHRpcGxleGVycyBhcmUgY29udHJvbGxlZCBieSB0aGUgbG93ZXIgOCBHUElPIHBpbnMgb2YgdGhlCi8vIGJ0ODc4LiBUaGUgbXVsdGlwbGV4ZXJzIHByb2JhYmx5IFBlcmljb20gUEk1VjMzMVEgb3Igc2ltaWxhci4KCi8vIHh4eDAgaXMgcGluIHh4eCBvZiBtdWx0aXBsZXhlciBVNSwKLy8geXl5MSBpcyBwaW4geXl5IG9mIG11bHRpcGxleGVyIFUyCgojZGVmaW5lIEVOQTAgICAgMHgwMQojZGVmaW5lIEVOQjAgICAgMHgwMgojZGVmaW5lIEVOQTEgICAgMHgwNAojZGVmaW5lIEVOQjEgICAgMHgwOAoKI2RlZmluZSBJTjEwICAgIDB4MTAKI2RlZmluZSBJTjAwICAgIDB4MjAKI2RlZmluZSBJTjExICAgIDB4NDAKI2RlZmluZSBJTjAxICAgIDB4ODAKCnN0YXRpYyB2b2lkIHhndWFyZF9tdXhzZWwoc3RydWN0IGJ0dHYgKmJ0diwgdW5zaWduZWQgaW50IGlucHV0KQp7CglzdGF0aWMgY29uc3QgaW50IG1hc2tzW10gPSB7CiAgICAgICAgICAgICAgICBFTkIwLCBFTkIwfElOMDAsIEVOQjB8SU4xMCwgRU5CMHxJTjAwfElOMTAsCiAgICAgICAgICAgICAgICBFTkEwLCBFTkEwfElOMDAsIEVOQTB8SU4xMCwgRU5BMHxJTjAwfElOMTAsCiAgICAgICAgICAgICAgICBFTkIxLCBFTkIxfElOMDEsIEVOQjF8SU4xMSwgRU5CMXxJTjAxfElOMTEsCiAgICAgICAgICAgICAgICBFTkExLCBFTkExfElOMDEsIEVOQTF8SU4xMSwgRU5BMXxJTjAxfElOMTEsCgl9OwoJZ3Bpb193cml0ZShtYXNrc1tpbnB1dCUxNl0pOwp9CnN0YXRpYyB2b2lkIHBpY29sb190ZXRyYV9pbml0KHN0cnVjdCBidHR2ICpidHYpCnsKCS8qVGhpcyBpcyB0aGUgdmlkZW8gaW5wdXQgcmVkaXJlY3Rpb24gZm9uY3Rpb25hbGl0eSA6IEkgRElEIE5PVCBVU0VEIElULiAqLwoJYnR3cml0ZSAoMHgwODw8MTYsQlQ4NDhfR1BJT19EQVRBKTsvKkdQSU9bMTldIFs9PT4gNDA1MyBCK0NdIHNldCB0byAxICovCglidHdyaXRlICgweDA0PDwxNixCVDg0OF9HUElPX0RBVEEpOy8qR1BJT1sxOF0gWz09PiA0MDUzIEFdICBzZXQgdG8gMSovCn0Kc3RhdGljIHZvaWQgcGljb2xvX3RldHJhX211eHNlbCAoc3RydWN0IGJ0dHYqIGJ0diwgdW5zaWduZWQgaW50IGlucHV0KQp7CgoJZHByaW50ayAoS0VSTl9ERUJVRyAiYnR0diVkIDogcGljb2xvX3RldHJhX211eHNlbCA9PiAgaW5wdXQgPSAlZFxuIixidHYtPmMubnIsaW5wdXQpOwoJLypKdXN0IHNldCB0aGUgcmlnaHQgcGF0aCBpbiB0aGUgYW5hbG9nIG11bHRpcGxleGVycyA6IGNoYW5uZWwgMSAtPiA0ID09PiBBbmFsb2cgTXV4ID09PiBNVVgwKi8KCS8qR1BJT1syMF0mR1BJT1syMV0gdXNlZCB0byBjaG9vc2UgdGhlIHJpZ2h0IGlucHV0Ki8KCWJ0d3JpdGUgKGlucHV0PDwyMCxCVDg0OF9HUElPX0RBVEEpOwoKfQoKLyoKICogaXZjMTIwX211eHNlbCBbQWRkZWQgYnkgQWxhbiBHYXJmaWVsZCA8YWxhbkBmcm9tb3JiaXQuY29tPl0KICoKICogVGhlIElWQzEyMEcgc2VjdXJpdHkgY2FyZCBoYXMgNCBpMmMgY29udHJvbGxlZCBUREE4NTQwIG1hdHJpeAogKiBzd2ljaGVycyB0byBwcm92aWRlIDE2IGNoYW5uZWxzIHRvIE1VWDAuIFRoZSBUREE4NTQwJ3MgaGF2ZQogKiA0IGluZGVwZWRhbnQgb3V0cHV0cyBhbmQgYXMgc3VjaCB0aGUgSVZDMTIwRyBhbHNvIGhhcyB0aGUKICogb3B0aW9uYWwgIk1vbml0b3IgT3V0IiBidXMuIFRoaXMgYWxsb3dzIHRoZSBjYXJkIHRvIGJlIGxvb2tpbmcKICogYXQgb25lIGlucHV0IHdoaWxlIHRoZSBtb25pdG9yIGlzIGxvb2tpbmcgYXQgYW5vdGhlci4KICoKICogU2luY2UgSSd2ZSBjb3VsZG4ndCBiZSBib3RoZXJlZCBmaWd1cmluZyBvdXQgaG93IHRvIGFkZCBhbgogKiBpbmRlcGVuZGFudCBtdXhzZWwgZm9yIHRoZSBtb25pdG9yIGJ1cywgSSd2ZSBqdXN0IHNldCBpdCB0bwogKiB3aGF0ZXZlciB0aGUgY2FyZCBpcyBsb29raW5nIGF0LgogKgogKiAgT1VUMCBvZiB0aGUgVERBODU0MCdzIGlzIGNvbm5lY3RlZCB0byBNVVgwICAgICAgICAgKDB4MDMpCiAqICBPVVQxIG9mIHRoZSBUREE4NTQwJ3MgaXMgY29ubmVjdGVkIHRvICJNb25pdG9yIE91dCIgICAgICAgICgweDBDKQogKgogKiAgVERBODU0MF9BTFQzIElOMC0zID0gQ2hhbm5lbCAxMyAtIDE2ICAgICAgICgweDAzKQogKiAgVERBODU0MF9BTFQ0IElOMC0zID0gQ2hhbm5lbCAxIC0gNCAgICAgICAgICgweDAzKQogKiAgVERBODU0MF9BTFQ1IElOMC0zID0gQ2hhbm5lbCA1IC0gOCAgICAgICAgICgweDAzKQogKiAgVERBODU0MF9BTFQ2IElOMC0zID0gQ2hhbm5lbCA5IC0gMTIgICAgICAgICAgICAgICAgKDB4MDMpCiAqCiAqLwoKLyogQWxsIDcgcG9zc2libGUgc3ViLWlkcyBmb3IgdGhlIFREQTg1NDAgTWF0cml4IFN3aXRjaGVyICovCiNkZWZpbmUgSTJDX1REQTg1NDAgICAgICAgIDB4OTAKI2RlZmluZSBJMkNfVERBODU0MF9BTFQxICAgMHg5MgojZGVmaW5lIEkyQ19UREE4NTQwX0FMVDIgICAweDk0CiNkZWZpbmUgSTJDX1REQTg1NDBfQUxUMyAgIDB4OTYKI2RlZmluZSBJMkNfVERBODU0MF9BTFQ0ICAgMHg5OAojZGVmaW5lIEkyQ19UREE4NTQwX0FMVDUgICAweDlhCiNkZWZpbmUgSTJDX1REQTg1NDBfQUxUNiAgIDB4OWMKCnN0YXRpYyB2b2lkIGl2YzEyMF9tdXhzZWwoc3RydWN0IGJ0dHYgKmJ0diwgdW5zaWduZWQgaW50IGlucHV0KQp7CgkvLyBTaW1wbGUgbWF0aHMKCWludCBrZXkgPSBpbnB1dCAlIDQ7CglpbnQgbWF0cml4ID0gaW5wdXQgLyA0OwoKCWRwcmludGsoImJ0dHYlZDogaXZjMTIwX211eHNlbDogSW5wdXQgLSAlMDJkIHwgVERBIC0gJTAyZCB8IEluIC0gJTAyZFxuIiwKCQlidHYtPmMubnIsIGlucHV0LCBtYXRyaXgsIGtleSk7CgoJLy8gSGFuZGxlcyB0aGUgaW5wdXQgc2VsZWN0aW9uIG9uIHRoZSBUREE4NTQwJ3MKCWJ0dHZfSTJDV3JpdGUoYnR2LCBJMkNfVERBODU0MF9BTFQzLCAweDAwLAoJCSAgICAgICgobWF0cml4ID09IDMpID8gKGtleSB8IGtleSA8PCAyKSA6IDB4MDApLCAxKTsKCWJ0dHZfSTJDV3JpdGUoYnR2LCBJMkNfVERBODU0MF9BTFQ0LCAweDAwLAoJCSAgICAgICgobWF0cml4ID09IDApID8gKGtleSB8IGtleSA8PCAyKSA6IDB4MDApLCAxKTsKCWJ0dHZfSTJDV3JpdGUoYnR2LCBJMkNfVERBODU0MF9BTFQ1LCAweDAwLAoJCSAgICAgICgobWF0cml4ID09IDEpID8gKGtleSB8IGtleSA8PCAyKSA6IDB4MDApLCAxKTsKCWJ0dHZfSTJDV3JpdGUoYnR2LCBJMkNfVERBODU0MF9BTFQ2LCAweDAwLAoJCSAgICAgICgobWF0cml4ID09IDIpID8gKGtleSB8IGtleSA8PCAyKSA6IDB4MDApLCAxKTsKCgkvLyBIYW5kbGVzIHRoZSBvdXRwdXQgZW5hYmxlcyBvbiB0aGUgVERBODU0MCdzCglidHR2X0kyQ1dyaXRlKGJ0diwgSTJDX1REQTg1NDBfQUxUMywgMHgwMiwKCQkgICAgICAoKG1hdHJpeCA9PSAzKSA/IDB4MDMgOiAweDAwKSwgMSk7ICAvLyAxMyAtIDE2CglidHR2X0kyQ1dyaXRlKGJ0diwgSTJDX1REQTg1NDBfQUxUNCwgMHgwMiwKCQkgICAgICAoKG1hdHJpeCA9PSAwKSA/IDB4MDMgOiAweDAwKSwgMSk7ICAvLyAxLTQKCWJ0dHZfSTJDV3JpdGUoYnR2LCBJMkNfVERBODU0MF9BTFQ1LCAweDAyLAoJCSAgICAgICgobWF0cml4ID09IDEpID8gMHgwMyA6IDB4MDApLCAxKTsgIC8vIDUtOAoJYnR0dl9JMkNXcml0ZShidHYsIEkyQ19UREE4NTQwX0FMVDYsIDB4MDIsCgkJICAgICAgKChtYXRyaXggPT0gMikgPyAweDAzIDogMHgwMCksIDEpOyAgLy8gOS0xMgoKCS8vIFNlbGVjdHMgTVVYMCBmb3IgaW5wdXQgb24gdGhlIDg3OAoJYnRhb3IoKDApPDw1LCB+KDM8PDUpLCBCVDg0OF9JRk9STSk7Cn0KCgovKiBQWEMyMDAgbXV4c2VsIGhlbHBlcgogKiBsdWtlQHN5c2VuZy5hbnUuZWR1LmF1CiAqIGFub3RoZXIgdHJhbnNwbGFudAogKiBmcm9tIEFsZXNzYW5kcm8gUnViaW5pIChydWJpbmlAbGludXguaXQpCiAqCiAqIFRoZXJlIGFyZSA0IGtpbmRzIG9mIGNhcmRzOgogKiBQWEMyMDBMIHdoaWNoIGlzIGJ0ODQ4CiAqIFBYQzIwMEYgd2hpY2ggaXMgYnQ4NDggd2l0aCBQSUMgY29udHJvbGxpbmcgbXV4CiAqIFBYQzIwMEFMIHdoaWNoIGlzIGJ0ODc4CiAqIFBYQzIwMEFGIHdoaWNoIGlzIGJ0ODc4IHdpdGggUElDIGNvbnRyb2xsaW5nIG11eAogKi8KI2RlZmluZSBQWF9DRkdfUFhDMjAwRiAweDAxCiNkZWZpbmUgUFhfRkxBR19QWEMyMDBBICAweDAwMDAxMDAwIC8qIGEgcHhjMjAwQSBpcyBidC04NzggYmFzZWQgKi8KI2RlZmluZSBQWF9JMkNfUElDICAgICAgIDB4MGYKI2RlZmluZSBQWF9QWEMyMDBBX0NBUkRJRCAweDIwMGExMjk1CiNkZWZpbmUgUFhfSTJDX0NNRF9DRkcgICAweDAwCgpzdGF0aWMgdm9pZCBQWEMyMDBfbXV4c2VsKHN0cnVjdCBidHR2ICpidHYsIHVuc2lnbmVkIGludCBpbnB1dCkKewogICAgICAgIGludCByYzsKCWxvbmcgbXV4OwoJaW50IGJpdG1hc2s7CiAgICAgICAgdW5zaWduZWQgY2hhciBidWZbMl07CgoJLyogUmVhZCBQSUMgY29uZmlnIHRvIGRldGVybWluZSBpZiB0aGlzIGlzIGEgUFhDMjAwRiAqLwoJLyogUFhfSTJDX0NNRF9DRkcqLwoJYnVmWzBdPTA7CglidWZbMV09MDsKCXJjPWJ0dHZfSTJDV3JpdGUoYnR2LChQWF9JMkNfUElDPDwxKSxidWZbMF0sYnVmWzFdLDEpOwoJaWYgKHJjKSB7CgkgIHByaW50ayhLRVJOX0RFQlVHICJidHR2JWQ6IFBYQzIwMF9tdXhzZWw6IHBpYyBjZmcgd3JpdGUgZmFpbGVkOiVkXG4iLCBidHYtPmMubnIscmMpOwoJICAvKiBub3QgUFhDID8gZG8gbm90aGluZyAqLwoJICByZXR1cm47Cgl9CgoJcmM9YnR0dl9JMkNSZWFkKGJ0diwoUFhfSTJDX1BJQzw8MSksTlVMTCk7CglpZiAoIShyYyAmIFBYX0NGR19QWEMyMDBGKSkgewoJICBwcmludGsoS0VSTl9ERUJVRyAiYnR0diVkOiBQWEMyMDBfbXV4c2VsOiBub3QgUFhDMjAwRiByYzolZCBcbiIsIGJ0di0+Yy5ucixyYyk7CgkgIHJldHVybjsKCX0KCgoJLyogVGhlIG11bHRpcGxleGVyIGluIHRoZSAyMDBGIGlzIGhhbmRsZWQgYnkgdGhlIEdQSU8gcG9ydCAqLwoJLyogZ2V0IGNvcnJlY3QgbWFwcGluZyBiZXR3ZWVuIGlucHV0cyAgKi8KCS8qICBtdXggPSBidHR2X3R2Y2FyZHNbYnR2LT50eXBlXS5tdXhzZWxbaW5wdXRdICYgMzsgKi8KCS8qICoqIG5vdCBuZWVkZWQhPyAgICovCgltdXggPSBpbnB1dDsKCgkvKiBtYWtlIHN1cmUgb3V0cHV0IHBpbnMgYXJlIGVuYWJsZWQgKi8KCS8qIGJpdG1hc2s9MHgzMGY7ICovCgliaXRtYXNrPTB4MzAyOwoJLyogY2hlY2sgd2hldGhlciB3ZSBoYXZlIGEgUFhDMjAwQSAqLwogCWlmIChidHYtPmNhcmRpZCA9PSBQWF9QWEMyMDBBX0NBUkRJRCkgIHsKCSAgIGJpdG1hc2sgXj0gMHgxODA7IC8qIHVzZSA3IGFuZCA5LCBub3QgOCBhbmQgOSAqLwoJICAgYml0bWFzayB8PSA3PDw0OyAvKiB0aGUgREFDICovCgl9CglidHdyaXRlKGJpdG1hc2ssIEJUODQ4X0dQSU9fT1VUX0VOKTsKCgliaXRtYXNrID0gYnRyZWFkKEJUODQ4X0dQSU9fREFUQSk7CiAJaWYgKGJ0di0+Y2FyZGlkID09IFBYX1BYQzIwMEFfQ0FSRElEKQoJICBiaXRtYXNrID0gKGJpdG1hc2sgJiB+MHgyODApIHwgKChtdXggJiAyKSA8PCA4KSB8ICgobXV4ICYgMSkgPDwgNyk7CgllbHNlIC8qIG9sZGVyIGRldmljZSAqLwoJICBiaXRtYXNrID0gKGJpdG1hc2sgJiB+MHgzMDApIHwgKChtdXggJiAzKSA8PCA4KTsKCWJ0d3JpdGUoYml0bWFzayxCVDg0OF9HUElPX0RBVEEpOwoKCS8qCgkgKiBXYXMgInRvIGJlIHNhZmUsIHNldCB0aGUgYnQ4NDggdG8gaW5wdXQgMCIKCSAqIEFjdHVhbGx5LCBzaW5jZSBpdCdzIG9rIGF0IGxvYWQgdGltZSwgYmV0dGVyIG5vdCBtZXNzaW5nCgkgKiB3aXRoIHRoZXNlIGJpdHMgKG9uIFBYQzIwMEFGIHlvdSBuZWVkIHRvIHNldCBtdXggMiBoZXJlKQoJICoKCSAqIG5lZWRlZCBiZWNhdXNlIGJ0dHYtZHJpdmVyIHNldHMgbXV4IGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24KCSAqLwogCWlmIChidHYtPmNhcmRpZCA9PSBQWF9QWEMyMDBBX0NBUkRJRCkKCSAgYnRhb3IoMjw8NSwgfkJUODQ4X0lGT1JNX01VWFNFTCwgQlQ4NDhfSUZPUk0pOwoJZWxzZSAvKiBvbGRlciBkZXZpY2UgKi8KCSAgYnRhbmQofkJUODQ4X0lGT1JNX01VWFNFTCxCVDg0OF9JRk9STSk7CgoJcHJpbnRrKEtFUk5fREVCVUcgImJ0dHYlZDogc2V0dGluZyBpbnB1dCBjaGFubmVsIHRvOiVkXG4iLCBidHYtPmMubnIsKGludCltdXgpOwp9CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwovKiBtb3RoZXJib2FyZCBjaGlwc2V0IHNwZWNpZmljIHN0dWZmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKdm9pZCBfX2RldmluaXQgYnR0dl9jaGVja19jaGlwc2V0KHZvaWQpCnsKCWludCBwY2lwY2lfZmFpbCA9IDA7CglzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gTlVMTDsKCglpZiAocGNpX3BjaV9wcm9ibGVtcyAmIFBDSVBDSV9GQUlMKQoJCXBjaXBjaV9mYWlsID0gMTsKCWlmIChwY2lfcGNpX3Byb2JsZW1zICYgKFBDSVBDSV9UUklUT058UENJUENJX05BVE9NQXxQQ0lQQ0lfVklBRVRCRikpCgkJdHJpdG9uMSA9IDE7CglpZiAocGNpX3BjaV9wcm9ibGVtcyAmIFBDSVBDSV9WU0ZYKQoJCXZzZnggPSAxOwojaWZkZWYgUENJUENJX0FMSU1BR0lLCglpZiAocGNpX3BjaV9wcm9ibGVtcyAmIFBDSVBDSV9BTElNQUdJSykKCQlsYXRlbmN5ID0gMHgwQTsKI2VuZGlmCgojaWYgMAoJLyogcHJpbnQgd2hpY2ggY2hpcHNldCB3ZSBoYXZlICovCgl3aGlsZSAoKGRldiA9IHBjaV9maW5kX2NsYXNzKFBDSV9DTEFTU19CUklER0VfSE9TVCA8PCA4LGRldikpKQoJCXByaW50ayhLRVJOX0lORk8gImJ0dHY6IEhvc3QgYnJpZGdlIGlzICVzXG4iLHBjaV9uYW1lKGRldikpOwojZW5kaWYKCgkvKiBwcmludCB3YXJuaW5ncyBhYm91dCBhbnkgcXVpcmtzIGZvdW5kICovCglpZiAodHJpdG9uMSkKCQlwcmludGsoS0VSTl9JTkZPICJidHR2OiBIb3N0IGJyaWRnZSBuZWVkcyBFVEJGIGVuYWJsZWQuXG4iKTsKCWlmICh2c2Z4KQoJCXByaW50ayhLRVJOX0lORk8gImJ0dHY6IEhvc3QgYnJpZGdlIG5lZWRzIFZTRlggZW5hYmxlZC5cbiIpOwoJaWYgKHBjaXBjaV9mYWlsKSB7CgkJcHJpbnRrKEtFUk5fV0FSTklORyAiYnR0djogQlQ4NDggYW5kIHlvdXIgY2hpcHNldCBtYXkgbm90IHdvcmsgdG9nZXRoZXIuXG4iKTsKCQlpZiAoVU5TRVQgPT0gbm9fb3ZlcmxheSkgewoJCQlwcmludGsoS0VSTl9XQVJOSU5HICJidHR2OiBnb2luZyB0byBkaXNhYmxlIG92ZXJsYXkuXG4iKTsKCQkJbm9fb3ZlcmxheSA9IDE7CgkJfQoJfQoJaWYgKFVOU0VUICE9IGxhdGVuY3kpCgkJcHJpbnRrKEtFUk5fSU5GTyAiYnR0djogcGNpIGxhdGVuY3kgZml4dXAgWyVkXVxuIixsYXRlbmN5KTsKCgl3aGlsZSAoKGRldiA9IHBjaV9maW5kX2RldmljZShQQ0lfVkVORE9SX0lEX0lOVEVMLAoJCQkJICAgICAgUENJX0RFVklDRV9JRF9JTlRFTF84MjQ0MSwgZGV2KSkpIHsKICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgYjsKCQlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIDB4NTMsICZiKTsKCQlpZiAoYnR0dl9kZWJ1ZykKCQkJcHJpbnRrKEtFUk5fSU5GTyAiYnR0djogSG9zdCBicmlkZ2U6IDgyNDQxRlggTmF0b21hLCAiCgkJCSAgICAgICAiYnVmY29uPTB4JTAyeFxuIixiKTsKCX0KfQoKaW50IF9fZGV2aW5pdCBidHR2X2hhbmRsZV9jaGlwc2V0KHN0cnVjdCBidHR2ICpidHYpCnsKIAl1bnNpZ25lZCBjaGFyIGNvbW1hbmQ7CgoJaWYgKCF0cml0b24xICYmICF2c2Z4ICYmIFVOU0VUID09IGxhdGVuY3kpCgkJcmV0dXJuIDA7CgoJaWYgKGJ0dHZfdmVyYm9zZSkgewoJCWlmICh0cml0b24xKQoJCQlwcmludGsoS0VSTl9JTkZPICJidHR2JWQ6IGVuYWJsaW5nIEVUQkYgKDQzMEZYL1ZQMyBjb21wYXRpYmlsdHkpXG4iLGJ0di0+Yy5ucik7CgkJaWYgKHZzZnggJiYgYnR2LT5pZCA+PSA4NzgpCgkJCXByaW50ayhLRVJOX0lORk8gImJ0dHYlZDogZW5hYmxpbmcgVlNGWFxuIixidHYtPmMubnIpOwoJCWlmIChVTlNFVCAhPSBsYXRlbmN5KQoJCQlwcmludGsoS0VSTl9JTkZPICJidHR2JWQ6IHNldHRpbmcgcGNpIHRpbWVyIHRvICVkXG4iLAoJCQkgICAgICAgYnR2LT5jLm5yLGxhdGVuY3kpOwoJfQoKCWlmIChidHYtPmlkIDwgODc4KSB7CgkJLyogYnQ4NDggKG1pcyl1c2VzIGEgYml0IGluIHRoZSBpcnEgbWFzayBmb3IgZXRiZiAqLwoJCWlmICh0cml0b24xKQoJCQlidHYtPnRyaXRvbjEgPSBCVDg0OF9JTlRfRVRCRjsKCX0gZWxzZSB7CgkJLyogYnQ4NzggaGFzIGEgYml0IGluIHRoZSBwY2kgY29uZmlnIHNwYWNlIGZvciBpdCAqLwogICAgICAgICAgICAgICAgcGNpX3JlYWRfY29uZmlnX2J5dGUoYnR2LT5jLnBjaSwgQlQ4NzhfREVWQ1RSTCwgJmNvbW1hbmQpOwoJCWlmICh0cml0b24xKQoJCQljb21tYW5kIHw9IEJUODc4X0VOX1RCRlg7CgkJaWYgKHZzZngpCgkJCWNvbW1hbmQgfD0gQlQ4NzhfRU5fVlNGWDsKICAgICAgICAgICAgICAgIHBjaV93cml0ZV9jb25maWdfYnl0ZShidHYtPmMucGNpLCBCVDg3OF9ERVZDVFJMLCBjb21tYW5kKTsKICAgICAgICB9CglpZiAoVU5TRVQgIT0gbGF0ZW5jeSkKCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoYnR2LT5jLnBjaSwgUENJX0xBVEVOQ1lfVElNRVIsIGxhdGVuY3kpOwoJcmV0dXJuIDA7Cn0KCgovKgogKiBMb2NhbCB2YXJpYWJsZXM6CiAqIGMtYmFzaWMtb2Zmc2V0OiA4CiAqIEVuZDoKICovCg==